library(ggplot2)
library(gridExtra)
library(GGally)
library(corrplot)
library(dplyr)
library(tidyr)
library(viridis)
library(reshape2)

# Configuración general
theme_set(theme_minimal(base_size = 11))

# NOTA: Reemplazar 'ckd_data' con el nombre real de tu dataframe
getwd()  
[1] "/Users/samircabrera/Development/Universidad/Inteligencia Artificial/Inteligencia-Artificial/Proyecto/Code/plots"
setwd("/Users/samircabrera/Development/Universidad/Inteligencia Artificial/Inteligencia-Artificial")  
ckd_data <- read.csv("/Users/samircabrera/Development/Universidad/Inteligencia Artificial/Inteligencia-Artificial/Proyecto/Dataset/Chronic_Kidney_Dsease_data.csv")
head(datos)

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGxvdF9jb3JyZWxhdGlvbl9tYXRyaXggPC0gZnVuY3Rpb24oZGF0YSkge1xuICAjIFNlbGVjY2lvbmFyIHNvbG8gdmFyaWFibGVzIG51bcOpcmljYXMgcmVsZXZhbnRlc1xuICBudW1lcmljX3ZhcnMgPC0gZGF0YSAlPiUgXG4gICAgc2VsZWN0KEFnZSwgQk1JLCBTeXN0b2xpY0JQLCBEaWFzdG9saWNCUCwgRmFzdGluZ0Jsb29kU3VnYXIsIEhiQTFjLFxuICAgICAgICAgICBTZXJ1bUNyZWF0aW5pbmUsIEJVTkxldmVscywgR0ZSLCBQcm90ZWluSW5VcmluZSwgQUNSLFxuICAgICAgICAgICBIZW1vZ2xvYmluTGV2ZWxzLCBDaG9sZXN0ZXJvbFRvdGFsLCBDaG9sZXN0ZXJvbExETCxcbiAgICAgICAgICAgRmF0aWd1ZUxldmVscywgUXVhbGl0eU9mTGlmZVNjb3JlLCBNZWRpY2F0aW9uQWRoZXJlbmNlKVxuICBcbiAgY29yX21hdHJpeCA8LSBjb3IobnVtZXJpY192YXJzLCB1c2UgPSBcImNvbXBsZXRlLm9ic1wiKVxuICBcbiAgY29ycnBsb3QoY29yX21hdHJpeCwgXG4gICAgICAgICAgIG1ldGhvZCA9IFwiY29sb3JcIixcbiAgICAgICAgICAgdHlwZSA9IFwidXBwZXJcIixcbiAgICAgICAgICAgb3JkZXIgPSBcImhjbHVzdFwiLCAgIyBBZ3J1cGFjacOzbiBqZXLDoXJxdWljYVxuICAgICAgICAgICBhZGRyZWN0ID0gNCwgICAgICAgIyBNYXJjYSA0IGNsdXN0ZXJzIHByaW5jaXBhbGVzXG4gICAgICAgICAgIHRsLmNvbCA9IFwiYmxhY2tcIixcbiAgICAgICAgICAgdGwuc3J0ID0gNDUsXG4gICAgICAgICAgIHRsLmNleCA9IDAuOCxcbiAgICAgICAgICAgY29sID0gY29sb3JSYW1wUGFsZXR0ZShjKFwiIzZEOUVDMVwiLCBcIndoaXRlXCIsIFwiI0U0NjcyNlwiKSkoMjAwKSxcbiAgICAgICAgICAgdGl0bGUgPSBcIk1hdHJpeiBkZSBDb3JyZWxhY2nDs24gY29uIENsdXN0ZXJpbmcgSmVyw6FycXVpY29cIixcbiAgICAgICAgICAgbWFyID0gYygwLDAsMiwwKSlcbn1cbmBgYCJ9 -->

```r
plot_correlation_matrix <- function(data) {
  # Seleccionar solo variables numéricas relevantes
  numeric_vars <- data %>% 
    select(Age, BMI, SystolicBP, DiastolicBP, FastingBloodSugar, HbA1c,
           SerumCreatinine, BUNLevels, GFR, ProteinInUrine, ACR,
           HemoglobinLevels, CholesterolTotal, CholesterolLDL,
           FatigueLevels, QualityOfLifeScore, MedicationAdherence)
  
  cor_matrix <- cor(numeric_vars, use = \complete.obs\)
  
  corrplot(cor_matrix, 
           method = \color\,
           type = \upper\,
           order = \hclust\,  # Agrupación jerárquica
           addrect = 4,       # Marca 4 clusters principales
           tl.col = \black\,
           tl.srt = 45,
           tl.cex = 0.8,
           col = colorRampPalette(c(\#6D9EC1\, \white\, \#E46726\))(200),
           title = \Matriz de Correlación con Clustering Jerárquico\,
           mar = c(0,0,2,0))
}
```

<!-- rnb-source-end -->
```r
plot_correlation_matrix <- function(data) {
  # Seleccionar solo variables numéricas relevantes
  numeric_vars <- data %>% 
    select(Age, BMI, SystolicBP, DiastolicBP, FastingBloodSugar, HbA1c,
           SerumCreatinine, BUNLevels, GFR, ProteinInUrine, ACR,
           HemoglobinLevels, CholesterolTotal, CholesterolLDL,
           FatigueLevels, QualityOfLifeScore, MedicationAdherence)
  
  cor_matrix <- cor(numeric_vars, use = \complete.obs\)
  
  corrplot(cor_matrix, 
           method = \color\,
           type = \upper\,
           order = \hclust\,  # Agrupación jerárquica
           addrect = 4,       # Marca 4 clusters principales
           tl.col = \black\,
           tl.srt = 45,
           tl.cex = 0.8,
           col = colorRampPalette(c(\#6D9EC1\, \white\, \#E46726\))(200),
           title = \Matriz de Correlación con Clustering Jerárquico\,
           mar = c(0,0,2,0))
}

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjR3h2ZEY5eVpXNWhiRjl3WVdseWN5QThMU0JtZFc1amRHbHZiaWhrWVhSaEtTQjdYRzRnSUhKbGJtRnNYMlJoZEdFZ1BDMGdaR0YwWVNBbFBpVmNiaUFnSUNCelpXeGxZM1FvUjBaU0xDQlRaWEoxYlVOeVpXRjBhVzVwYm1Vc0lFSlZUa3hsZG1Wc2N5d2dVSEp2ZEdWcGJrbHVWWEpwYm1Vc0lFRkRVaXdnUkdsaFoyNXZjMmx6S1NBbFBpVmNiaUFnSUNCdGRYUmhkR1VvUkdsaFoyNXZjMmx6SUQwZ1ptRmpkRzl5S0VScFlXZHViM05wY3l3Z2JHRmlaV3h6SUQwZ1l5aGNJazV2SUVOTFJGd2lMQ0JjSWtOTFJGd2lLU2twWEc0Z0lGeHVJQ0JuWjNCaGFYSnpLSEpsYm1Gc1gyUmhkR0VzWEc0Z0lDQWdJQ0FnSUNBZ1kyOXNkVzF1Y3lBOUlERTZOU3hjYmlBZ0lDQWdJQ0FnSUNCaFpYTW9ZMjlzYjNJZ1BTQkVhV0ZuYm05emFYTXNJR0ZzY0doaElEMGdNQzQxS1N4Y2JpQWdJQ0FnSUNBZ0lDQjFjSEJsY2lBOUlHeHBjM1FvWTI5dWRHbHVkVzkxY3lBOUlIZHlZWEFvWENKamIzSmNJaXdnYzJsNlpTQTlJRE1wS1N4Y2JpQWdJQ0FnSUNBZ0lDQnNiM2RsY2lBOUlHeHBjM1FvWTI5dWRHbHVkVzkxY3lBOUlIZHlZWEFvWENKd2IybHVkSE5jSWl3Z1lXeHdhR0VnUFNBd0xqTXNJSE5wZW1VZ1BTQXdMalVwS1N4Y2JpQWdJQ0FnSUNBZ0lDQmthV0ZuSUQwZ2JHbHpkQ2hqYjI1MGFXNTFiM1Z6SUQwZ2QzSmhjQ2hjSW1SbGJuTnBkSGxFYVdGblhDSXNJR0ZzY0doaElEMGdNQzQxS1Nrc1hHNGdJQ0FnSUNBZ0lDQWdkR2wwYkdVZ1BTQmNJbEpsYkdGamFXOXVaWE1nWlc1MGNtVWdUV0Z5WTJGa2IzSmxjeUJTWlc1aGJHVnpJQ2h3YjNJZ1JHbGhaMjV2YzJsektWd2lLU0FyWEc0Z0lDQWdkR2hsYldVb2NHeHZkQzUwYVhSc1pTQTlJR1ZzWlcxbGJuUmZkR1Y0ZENob2FuVnpkQ0E5SURBdU5Td2dabUZqWlNBOUlGd2lZbTlzWkZ3aUtTbGNibjFjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbnBsb3RfcmVuYWxfcGFpcnMgPC0gZnVuY3Rpb24oZGF0YSkge1xuICByZW5hbF9kYXRhIDwtIGRhdGEgJT4lXG4gICAgc2VsZWN0KEdGUiwgU2VydW1DcmVhdGluaW5lLCBCVU5MZXZlbHMsIFByb3RlaW5JblVyaW5lLCBBQ1IsIERpYWdub3NpcykgJT4lXG4gICAgbXV0YXRlKERpYWdub3NpcyA9IGZhY3RvcihEaWFnbm9zaXMsIGxhYmVscyA9IGMoXFxObyBDS0RcXCwgXFxDS0RcXCkpKVxuICBcbiAgZ2dwYWlycyhyZW5hbF9kYXRhLFxuICAgICAgICAgIGNvbHVtbnMgPSAxOjUsXG4gICAgICAgICAgYWVzKGNvbG9yID0gRGlhZ25vc2lzLCBhbHBoYSA9IDAuNSksXG4gICAgICAgICAgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKFxcY29yXFwsIHNpemUgPSAzKSksXG4gICAgICAgICAgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKFxccG9pbnRzXFwsIGFscGhhID0gMC4zLCBzaXplID0gMC41KSksXG4gICAgICAgICAgZGlhZyA9IGxpc3QoY29udGludW91cyA9IHdyYXAoXFxkZW5zaXR5RGlhZ1xcLCBhbHBoYSA9IDAuNSkpLFxuICAgICAgICAgIHRpdGxlID0gXFxSZWxhY2lvbmVzIGVudHJlIE1hcmNhZG9yZXMgUmVuYWxlcyAocG9yIERpYWdub3NpcylcXCkgK1xuICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSBcXGJvbGRcXCkpXG59XG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
plot_renal_pairs <- function(data) {
  renal_data <- data %>%
    select(GFR, SerumCreatinine, BUNLevels, ProteinInUrine, ACR, Diagnosis) %>%
    mutate(Diagnosis = factor(Diagnosis, labels = c(\No CKD\, \CKD\)))
  
  ggpairs(renal_data,
          columns = 1:5,
          aes(color = Diagnosis, alpha = 0.5),
          upper = list(continuous = wrap(\cor\, size = 3)),
          lower = list(continuous = wrap(\points\, alpha = 0.3, size = 0.5)),
          diag = list(continuous = wrap(\densityDiag\, alpha = 0.5)),
          title = \Relaciones entre Marcadores Renales (por Diagnosis)\) +
    theme(plot.title = element_text(hjust = 0.5, face = \bold\))
}



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNHeHZkRjl5Wlc1aGJGOXdZV2x5Y3lBOExTQm1kVzVqZEdsdmJpaGtZWFJoS1NCN1hHNGdJSEpsYm1Gc1gyUmhkR0VnUEMwZ1pHRjBZU0FsUGlWY2JpQWdJQ0J6Wld4bFkzUW9SMFpTTENCVFpYSjFiVU55WldGMGFXNXBibVVzSUVKVlRreGxkbVZzY3l3Z1VISnZkR1ZwYmtsdVZYSnBibVVzSUVGRFVpd2dSR2xoWjI1dmMybHpLU0FsUGlWY2JpQWdJQ0J0ZFhSaGRHVW9SR2xoWjI1dmMybHpJRDBnWm1GamRHOXlLRVJwWVdkdWIzTnBjeXdnYkdGaVpXeHpJRDBnWXloY1hFNXZJRU5MUkZ4Y0xDQmNYRU5MUkZ4Y0tTa3BYRzRnSUZ4dUlDQm5aM0JoYVhKektISmxibUZzWDJSaGRHRXNYRzRnSUNBZ0lDQWdJQ0FnWTI5c2RXMXVjeUE5SURFNk5TeGNiaUFnSUNBZ0lDQWdJQ0JoWlhNb1kyOXNiM0lnUFNCRWFXRm5ibTl6YVhNc0lHRnNjR2hoSUQwZ01DNDFLU3hjYmlBZ0lDQWdJQ0FnSUNCMWNIQmxjaUE5SUd4cGMzUW9ZMjl1ZEdsdWRXOTFjeUE5SUhkeVlYQW9YRnhqYjNKY1hDd2djMmw2WlNBOUlETXBLU3hjYmlBZ0lDQWdJQ0FnSUNCc2IzZGxjaUE5SUd4cGMzUW9ZMjl1ZEdsdWRXOTFjeUE5SUhkeVlYQW9YRnh3YjJsdWRITmNYQ3dnWVd4d2FHRWdQU0F3TGpNc0lITnBlbVVnUFNBd0xqVXBLU3hjYmlBZ0lDQWdJQ0FnSUNCa2FXRm5JRDBnYkdsemRDaGpiMjUwYVc1MWIzVnpJRDBnZDNKaGNDaGNYR1JsYm5OcGRIbEVhV0ZuWEZ3c0lHRnNjR2hoSUQwZ01DNDFLU2tzWEc0Z0lDQWdJQ0FnSUNBZ2RHbDBiR1VnUFNCY1hGSmxiR0ZqYVc5dVpYTWdaVzUwY21VZ1RXRnlZMkZrYjNKbGN5QlNaVzVoYkdWeklDaHdiM0lnUkdsaFoyNXZjMmx6S1Z4Y0tTQXJYRzRnSUNBZ2RHaGxiV1VvY0d4dmRDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hvYW5WemRDQTlJREF1TlN3Z1ptRmpaU0E5SUZ4Y1ltOXNaRnhjS1NsY2JuMWNibUJnWUZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5gYGByXG5wbG90X3JlbmFsX3BhaXJzIDwtIGZ1bmN0aW9uKGRhdGEpIHtcbiAgcmVuYWxfZGF0YSA8LSBkYXRhICU+JVxuICAgIHNlbGVjdChHRlIsIFNlcnVtQ3JlYXRpbmluZSwgQlVOTGV2ZWxzLCBQcm90ZWluSW5VcmluZSwgQUNSLCBEaWFnbm9zaXMpICU+JVxuICAgIG11dGF0ZShEaWFnbm9zaXMgPSBmYWN0b3IoRGlhZ25vc2lzLCBsYWJlbHMgPSBjKFxcTm8gQ0tEXFwsIFxcQ0tEXFwpKSlcbiAgXG4gIGdncGFpcnMocmVuYWxfZGF0YSxcbiAgICAgICAgICBjb2x1bW5zID0gMTo1LFxuICAgICAgICAgIGFlcyhjb2xvciA9IERpYWdub3NpcywgYWxwaGEgPSAwLjUpLFxuICAgICAgICAgIHVwcGVyID0gbGlzdChjb250aW51b3VzID0gd3JhcChcXGNvclxcLCBzaXplID0gMykpLFxuICAgICAgICAgIGxvd2VyID0gbGlzdChjb250aW51b3VzID0gd3JhcChcXHBvaW50c1xcLCBhbHBoYSA9IDAuMywgc2l6ZSA9IDAuNSkpLFxuICAgICAgICAgIGRpYWcgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKFxcZGVuc2l0eURpYWdcXCwgYWxwaGEgPSAwLjUpKSxcbiAgICAgICAgICB0aXRsZSA9IFxcUmVsYWNpb25lcyBlbnRyZSBNYXJjYWRvcmVzIFJlbmFsZXMgKHBvciBEaWFnbm9zaXMpXFwpICtcbiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gXFxib2xkXFwpKVxufVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucGxvdF9yZW5hbF9wYWlycyA8LSBmdW5jdGlvbihkYXRhKSB7XG4gIHJlbmFsX2RhdGEgPC0gZGF0YSAlPiVcbiAgICBzZWxlY3QoR0ZSLCBTZXJ1bUNyZWF0aW5pbmUsIEJVTkxldmVscywgUHJvdGVpbkluVXJpbmUsIEFDUiwgRGlhZ25vc2lzKSAlPiVcbiAgICBtdXRhdGUoRGlhZ25vc2lzID0gZmFjdG9yKERpYWdub3NpcywgbGFiZWxzID0gYyhcXE5vIENLRFxcLCBcXENLRFxcKSkpXG4gIFxuICBnZ3BhaXJzKHJlbmFsX2RhdGEsXG4gICAgICAgICAgY29sdW1ucyA9IDE6NSxcbiAgICAgICAgICBhZXMoY29sb3IgPSBEaWFnbm9zaXMsIGFscGhhID0gMC41KSxcbiAgICAgICAgICB1cHBlciA9IGxpc3QoY29udGludW91cyA9IHdyYXAoXFxjb3JcXCwgc2l6ZSA9IDMpKSxcbiAgICAgICAgICBsb3dlciA9IGxpc3QoY29udGludW91cyA9IHdyYXAoXFxwb2ludHNcXCwgYWxwaGEgPSAwLjMsIHNpemUgPSAwLjUpKSxcbiAgICAgICAgICBkaWFnID0gbGlzdChjb250aW51b3VzID0gd3JhcChcXGRlbnNpdHlEaWFnXFwsIGFscGhhID0gMC41KSksXG4gICAgICAgICAgdGl0bGUgPSBcXFJlbGFjaW9uZXMgZW50cmUgTWFyY2Fkb3JlcyBSZW5hbGVzIChwb3IgRGlhZ25vc2lzKVxcKSArXG4gICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9IFxcYm9sZFxcKSlcbn1cbmBgYFxuYGBgIn0= -->

```r
```r
plot_renal_pairs <- function(data) {
  renal_data <- data %>%
    select(GFR, SerumCreatinine, BUNLevels, ProteinInUrine, ACR, Diagnosis) %>%
    mutate(Diagnosis = factor(Diagnosis, labels = c(\No CKD\, \CKD\)))
  
  ggpairs(renal_data,
          columns = 1:5,
          aes(color = Diagnosis, alpha = 0.5),
          upper = list(continuous = wrap(\cor\, size = 3)),
          lower = list(continuous = wrap(\points\, alpha = 0.3, size = 0.5)),
          diag = list(continuous = wrap(\densityDiag\, alpha = 0.5)),
          title = \Relaciones entre Marcadores Renales (por Diagnosis)\) +
    theme(plot.title = element_text(hjust = 0.5, face = \bold\))
}
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjR3h2ZEY5blpuSmZNMlFnUEMwZ1puVnVZM1JwYjI0b1pHRjBZU2tnZTF4dUlDQmtZWFJoWDNCc2IzUWdQQzBnWkdGMFlTQWxQaVZjYmlBZ0lDQnRkWFJoZEdVb1JHbGhaMjV2YzJseklEMGdabUZqZEc5eUtFUnBZV2R1YjNOcGN5d2diR0ZpWld4eklEMGdZeWhjSWs1dklFTkxSRndpTENCY0lrTkxSRndpS1NrcFhHNGdJRnh1SUNCblozQnNiM1FvWkdGMFlWOXdiRzkwTENCaFpYTW9lQ0E5SUZObGNuVnRRM0psWVhScGJtbHVaU3dnZVNBOUlFZEdVaWtwSUN0Y2JpQWdJQ0JuWlc5dFgzQnZhVzUwS0dGbGN5aGpiMnh2Y2lBOUlFRm5aU3dnYzJsNlpTQTlJRUpOU1N3Z2MyaGhjR1VnUFNCRWFXRm5ibTl6YVhNcExDQmhiSEJvWVNBOUlEQXVOaWtnSzF4dUlDQWdJSE5qWVd4bFgyTnZiRzl5WDNacGNtbGthWE1vYjNCMGFXOXVJRDBnWENKd2JHRnpiV0ZjSWlrZ0sxeHVJQ0FnSUhOallXeGxYM05wZW1WZlkyOXVkR2x1ZFc5MWN5aHlZVzVuWlNBOUlHTW9NU3dnTmlrcElDdGNiaUFnSUNCblpXOXRYM050YjI5MGFDaGhaWE1vYkdsdVpYUjVjR1VnUFNCRWFXRm5ibTl6YVhNcExDQnRaWFJvYjJRZ1BTQmNJbXh2WlhOelhDSXNJSE5sSUQwZ1ZGSlZSU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lzSUhOcGVtVWdQU0F3TGpncElDdGNiaUFnSUNCc1lXSnpLSFJwZEd4bElEMGdYQ0pIUmxJZ2RuTWdRM0psWVhScGJtbHVZU0FvUldSaFpDQmxiaUJqYjJ4dmNpd2dRazFKSUdWdUlIUmhiV0hEc1c4cFhDSXNYRzRnSUNBZ0lDQWdJQ0I0SUQwZ1hDSkRjbVZoZEdsdWFXNWhJRlBEcVhKcFkyRWdLRzFuTDJSTUtWd2lMRnh1SUNBZ0lDQWdJQ0FnZVNBOUlGd2lSMFpTSUNodFRDOXRhVzR2TVM0M00yM0NzaWxjSWl4Y2JpQWdJQ0FnSUNBZ0lHTmhjSFJwYjI0Z1BTQmNJa3hoY3lCc3c2MXVaV0Z6SUcxMVpYTjBjbUZ1SUhSbGJtUmxibU5wWVhNZ2NHOXlJR2R5ZFhCdklHUmxJR1JwWVdkdXc3TnpkR2xqYjF3aUtTQXJYRzRnSUNBZ2RHaGxiV1VvY0d4dmRDNTBhWFJzWlNBOUlHVnNaVzFsYm5SZmRHVjRkQ2hvYW5WemRDQTlJREF1TlN3Z1ptRmpaU0E5SUZ3aVltOXNaRndpS1N4Y2JpQWdJQ0FnSUNBZ0lDQnNaV2RsYm1RdWNHOXphWFJwYjI0Z1BTQmNJbkpwWjJoMFhDSXBYRzU5WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5wbG90X2dmcl8zZCA8LSBmdW5jdGlvbihkYXRhKSB7XG4gIGRhdGFfcGxvdCA8LSBkYXRhICU+JVxuICAgIG11dGF0ZShEaWFnbm9zaXMgPSBmYWN0b3IoRGlhZ25vc2lzLCBsYWJlbHMgPSBjKFxcTm8gQ0tEXFwsIFxcQ0tEXFwpKSlcbiAgXG4gIGdncGxvdChkYXRhX3Bsb3QsIGFlcyh4ID0gU2VydW1DcmVhdGluaW5lLCB5ID0gR0ZSKSkgK1xuICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gQWdlLCBzaXplID0gQk1JLCBzaGFwZSA9IERpYWdub3NpcyksIGFscGhhID0gMC42KSArXG4gICAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSBcXHBsYXNtYVxcKSArXG4gICAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA2KSkgK1xuICAgIGdlb21fc21vb3RoKGFlcyhsaW5ldHlwZSA9IERpYWdub3NpcyksIG1ldGhvZCA9IFxcbG9lc3NcXCwgc2UgPSBUUlVFLCBcbiAgICAgICAgICAgICAgICBjb2xvciA9IFxcYmxhY2tcXCwgc2l6ZSA9IDAuOCkgK1xuICAgIGxhYnModGl0bGUgPSBcXEdGUiB2cyBDcmVhdGluaW5hIChFZGFkIGVuIGNvbG9yXG4ifQ== -->
plot_gfr_3d <- function(data) {
  data_plot <- data %>%
    mutate(Diagnosis = factor(Diagnosis, labels = c(\No CKD\, \CKD\)))
  
  ggplot(data_plot, aes(x = SerumCreatinine, y = GFR)) +
    geom_point(aes(color = Age, size = BMI, shape = Diagnosis), alpha = 0.6) +
    scale_color_viridis(option = \plasma\) +
    scale_size_continuous(range = c(1, 6)) +
    geom_smooth(aes(linetype = Diagnosis), method = \loess\, se = TRUE, 
                color = \black\, size = 0.8) +
    labs(title = \GFR vs Creatinina (Edad en color
```r
plot_gfr_3d <- function(data) {
  data_plot <- data %>%
    mutate(Diagnosis = factor(Diagnosis, labels = c(\No CKD\, \CKD\)))
  
  ggplot(data_plot, aes(x = SerumCreatinine, y = GFR)) +
    geom_point(aes(color = Age, size = BMI, shape = Diagnosis), alpha = 0.6) +
    scale_color_viridis(option = \plasma\) +
    scale_size_continuous(range = c(1, 6)) +
    geom_smooth(aes(linetype = Diagnosis), method = \loess\, se = TRUE, 
                color = \black\, size = 0.8) +
    labs(title = \GFR vs Creatinina (Edad en color

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGxvdF9jbGluaWNhbF9oZWF0bWFwIDwtIGZ1bmN0aW9uKGRhdGEpIHtcbiAgIyBDcmVhciBlc3RhZGlvcyBkZSBDS0QgYmFzYWRvcyBlbiBHRlJcbiAgZGF0YV9zdGFnZWQgPC0gZGF0YSAlPiVcbiAgICBtdXRhdGUoQ0tEX1N0YWdlID0gY2FzZV93aGVuKFxuICAgICAgR0ZSID49IDkwIH4gXCJOb3JtYWwgKOKJpTkwKVwiLFxuICAgICAgR0ZSID49IDYwIH4gXCJNaWxkICg2MC04OSlcIixcbiAgICAgIEdGUiA+PSAzMCB+IFwiTW9kZXJhdGUgKDMwLTU5KVwiLFxuICAgICAgR0ZSID49IDE1IH4gXCJTZXZlcmUgKDE1LTI5KVwiLFxuICAgICAgVFJVRSB+IFwiS2lkbmV5IEZhaWx1cmUgKDwxNSlcIlxuICAgICkpICU+JVxuICAgIG11dGF0ZShDS0RfU3RhZ2UgPSBmYWN0b3IoQ0tEX1N0YWdlLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoXCJOb3JtYWwgKOKJpTkwKVwiLCBcIk1pbGQgKDYwLTg5KVwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJNb2RlcmF0ZSAoMzAtNTkpXCIsIFwiU2V2ZXJlICgxNS0yOSlcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiS2lkbmV5IEZhaWx1cmUgKDwxNSlcIikpKVxuICBcbiAgIyBDYWxjdWxhciBwcm9tZWRpb3MgcG9yIGVzdGFkaW9cbiAgaGVhdG1hcF9kYXRhIDwtIGRhdGFfc3RhZ2VkICU+JVxuICAgIGdyb3VwX2J5KENLRF9TdGFnZSkgJT4lXG4gICAgc3VtbWFyaXNlKFxuICAgICAgQk1JID0gbWVhbihCTUksIG5hLnJtID0gVFJVRSksXG4gICAgICBTeXN0b2xpY0JQID0gbWVhbihTeXN0b2xpY0JQLCBuYS5ybSA9IFRSVUUpLFxuICAgICAgSGJBMWMgPSBtZWFuKEhiQTFjLCBuYS5ybSA9IFRSVUUpLFxuICAgICAgQ3JlYXRpbmluZSA9IG1lYW4oU2VydW1DcmVhdGluaW5lLCBuYS5ybSA9IFRSVUUpLFxuICAgICAgSGVtb2dsb2JpbiA9IG1lYW4oSGVtb2dsb2JpbkxldmVscywgbmEucm0gPSBUUlVFKSxcbiAgICAgIFByb3RlaW5VcmluZSA9IG1lYW4oUHJvdGVpbkluVXJpbmUsIG5hLnJtID0gVFJVRSksXG4gICAgICBGYXRpZ3VlID0gbWVhbihGYXRpZ3VlTGV2ZWxzLCBuYS5ybSA9IFRSVUUpLFxuICAgICAgUW9MID0gbWVhbihRdWFsaXR5T2ZMaWZlU2NvcmUsIG5hLnJtID0gVFJVRSlcbiAgICApICU+JVxuICAgIHBpdm90X2xvbmdlcigtQ0tEX1N0YWdlLCBuYW1lc190byA9IFwiVmFyaWFibGVcIiwgdmFsdWVzX3RvID0gXCJWYWx1ZVwiKSAlPiVcbiAgICBncm91cF9ieShWYXJpYWJsZSkgJT4lXG4gICAgbXV0YXRlKFZhbHVlX3NjYWxlZCA9IHNjYWxlKFZhbHVlKVssMV0pICAjIEVzdGFuZGFyaXphciBwb3IgdmFyaWFibGVcbiAgXG4gIGdncGxvdChoZWF0bWFwX2RhdGEsIGFlcyh4ID0gQ0tEX1N0YWdlLCB5ID0gVmFyaWFibGUsIGZpbGwgPSBWYWx1ZV9zY2FsZWQpKSArXG4gICAgZ2VvbV90aWxlKGNvbG9yID0gXCJ3aGl0ZVwiLCBzaXplID0gMC41KSArXG4gICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKFZhbHVlLCAxKSksIHNpemUgPSAzLCBjb2xvciA9IFwid2hpdGVcIikgK1xuICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdyA9IFwiIzNCOUFCMlwiLCBtaWQgPSBcIiNFQkNDMkFcIiwgaGlnaCA9IFwiI0YyMUEwMFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgIG1pZHBvaW50ID0gMCwgbmFtZSA9IFwiWi1zY29yZVwiKSArXG4gICAgbGFicyh0aXRsZSA9IFwiUGVyZmlsIENsw61uaWNvIFByb21lZGlvIHBvciBFc3RhZGlvIGRlIENLRFwiLFxuICAgICAgICAgeCA9IFwiRXN0YWRpbyBkZSBFbmZlcm1lZGFkIFJlbmFsXCIsXG4gICAgICAgICB5ID0gXCJWYXJpYWJsZSBDbMOtbmljYVwiLFxuICAgICAgICAgY2FwdGlvbiA9IFwiVmFsb3JlcyBlc3RhbmRhcml6YWRvcyAoWi1zY29yZXMpIC0gbsO6bWVyb3MgPSB2YWxvciByZWFsIHByb21lZGlvXCIpICtcbiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLFxuICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSBcImJvbGRcIikpXG59XG5gYGAifQ== -->

```r
plot_clinical_heatmap <- function(data) {
  # Crear estadios de CKD basados en GFR
  data_staged <- data %>%
    mutate(CKD_Stage = case_when(
      GFR >= 90 ~ \Normal (≥90)\,
      GFR >= 60 ~ \Mild (60-89)\,
      GFR >= 30 ~ \Moderate (30-59)\,
      GFR >= 15 ~ \Severe (15-29)\,
      TRUE ~ \Kidney Failure (<15)\
    )) %>%
    mutate(CKD_Stage = factor(CKD_Stage, 
                              levels = c(\Normal (≥90)\, \Mild (60-89)\, 
                                         \Moderate (30-59)\, \Severe (15-29)\, 
                                         \Kidney Failure (<15)\)))
  
  # Calcular promedios por estadio
  heatmap_data <- data_staged %>%
    group_by(CKD_Stage) %>%
    summarise(
      BMI = mean(BMI, na.rm = TRUE),
      SystolicBP = mean(SystolicBP, na.rm = TRUE),
      HbA1c = mean(HbA1c, na.rm = TRUE),
      Creatinine = mean(SerumCreatinine, na.rm = TRUE),
      Hemoglobin = mean(HemoglobinLevels, na.rm = TRUE),
      ProteinUrine = mean(ProteinInUrine, na.rm = TRUE),
      Fatigue = mean(FatigueLevels, na.rm = TRUE),
      QoL = mean(QualityOfLifeScore, na.rm = TRUE)
    ) %>%
    pivot_longer(-CKD_Stage, names_to = \Variable\, values_to = \Value\) %>%
    group_by(Variable) %>%
    mutate(Value_scaled = scale(Value)[,1])  # Estandarizar por variable
  
  ggplot(heatmap_data, aes(x = CKD_Stage, y = Variable, fill = Value_scaled)) +
    geom_tile(color = \white\, size = 0.5) +
    geom_text(aes(label = round(Value, 1)), size = 3, color = \white\) +
    scale_fill_gradient2(low = \#3B9AB2\, mid = \#EBCC2A\, high = \#F21A00\,
                         midpoint = 0, name = \Z-score\) +
    labs(title = \Perfil Clínico Promedio por Estadio de CKD\,
         x = \Estadio de Enfermedad Renal\,
         y = \Variable Clínica\,
         caption = \Valores estandarizados (Z-scores) - números = valor real promedio\) +
    theme(axis.text.x = element_text(angle = 45, hjust = 1),
          plot.title = element_text(hjust = 0.5, face = \bold\))
}
```

<!-- rnb-source-end -->
```r
plot_clinical_heatmap <- function(data) {
  # Crear estadios de CKD basados en GFR
  data_staged <- data %>%
    mutate(CKD_Stage = case_when(
      GFR >= 90 ~ \Normal (≥90)\,
      GFR >= 60 ~ \Mild (60-89)\,
      GFR >= 30 ~ \Moderate (30-59)\,
      GFR >= 15 ~ \Severe (15-29)\,
      TRUE ~ \Kidney Failure (<15)\
    )) %>%
    mutate(CKD_Stage = factor(CKD_Stage, 
                              levels = c(\Normal (≥90)\, \Mild (60-89)\, 
                                         \Moderate (30-59)\, \Severe (15-29)\, 
                                         \Kidney Failure (<15)\)))
  
  # Calcular promedios por estadio
  heatmap_data <- data_staged %>%
    group_by(CKD_Stage) %>%
    summarise(
      BMI = mean(BMI, na.rm = TRUE),
      SystolicBP = mean(SystolicBP, na.rm = TRUE),
      HbA1c = mean(HbA1c, na.rm = TRUE),
      Creatinine = mean(SerumCreatinine, na.rm = TRUE),
      Hemoglobin = mean(HemoglobinLevels, na.rm = TRUE),
      ProteinUrine = mean(ProteinInUrine, na.rm = TRUE),
      Fatigue = mean(FatigueLevels, na.rm = TRUE),
      QoL = mean(QualityOfLifeScore, na.rm = TRUE)
    ) %>%
    pivot_longer(-CKD_Stage, names_to = \Variable\, values_to = \Value\) %>%
    group_by(Variable) %>%
    mutate(Value_scaled = scale(Value)[,1])  # Estandarizar por variable
  
  ggplot(heatmap_data, aes(x = CKD_Stage, y = Variable, fill = Value_scaled)) +
    geom_tile(color = \white\, size = 0.5) +
    geom_text(aes(label = round(Value, 1)), size = 3, color = \white\) +
    scale_fill_gradient2(low = \#3B9AB2\, mid = \#EBCC2A\, high = \#F21A00\,
                         midpoint = 0, name = \Z-score\) +
    labs(title = \Perfil Clínico Promedio por Estadio de CKD\,
         x = \Estadio de Enfermedad Renal\,
         y = \Variable Clínica\,
         caption = \Valores estandarizados (Z-scores) - números = valor real promedio\) +
    theme(axis.text.x = element_text(angle = 45, hjust = 1),
          plot.title = element_text(hjust = 0.5, face = \bold\))
}

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjR3h2ZEY5d1lYSmhiR3hsYkY5amIyOXlaR2x1WVhSbGN5QThMU0JtZFc1amRHbHZiaWhrWVhSaEtTQjdYRzRnSUhCaGNtRnNiR1ZzWDJSaGRHRWdQQzBnWkdGMFlTQWxQaVZjYmlBZ0lDQnpaV3hsWTNRb1VHRjBhV1Z1ZEVsRUxDQkNUVWtzSUZCb2VYTnBZMkZzUVdOMGFYWnBkSGtzSUVScFpYUlJkV0ZzYVhSNUxDQlRiR1ZsY0ZGMVlXeHBkSGtzWEc0Z0lDQWdJQ0FnSUNBZ0lFRnNZMjlvYjJ4RGIyNXpkVzF3ZEdsdmJpd2dVMjF2YTJsdVp5d2dSR2xoWjI1dmMybHpLU0FsUGlWY2JpQWdJQ0J0ZFhSaGRHVW9SR2xoWjI1dmMybHpJRDBnWm1GamRHOXlLRVJwWVdkdWIzTnBjeXdnYkdGaVpXeHpJRDBnWXloY0lrNXZJRU5MUkZ3aUxDQmNJa05MUkZ3aUtTa3BJQ1UrSlZ4dUlDQWdJQ01nUlhOMFlXNWtZWEpwZW1GeUlIWmhjbWxoWW14bGN5QndZWEpoSUdWelkyRnNZU0JqYjIzRHVtNWNiaUFnSUNCdGRYUmhkR1VvWVdOeWIzTnpLR01vUWsxSkxDQlFhSGx6YVdOaGJFRmpkR2wyYVhSNUxDQkVhV1YwVVhWaGJHbDBlU3dnVTJ4bFpYQlJkV0ZzYVhSNUxDQmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnUVd4amIyaHZiRU52Ym5OMWJYQjBhVzl1S1N3Z2MyTmhiR1VwS1NBbFBpVmNiaUFnSUNCellXMXdiR1ZmYmlneU1EQXBJQ0FqSUUxMVpYTjBjbUVnY0dGeVlTQmpiR0Z5YVdSaFpDQjJhWE4xWVd4Y2JpQWdYRzRnSUhCaGNtRnNiR1ZzWDJ4dmJtY2dQQzBnY0dGeVlXeHNaV3hmWkdGMFlTQWxQaVZjYmlBZ0lDQndhWFp2ZEY5c2IyNW5aWElvWTI5c2N5QTlJR01vUWsxSkxDQlFhSGx6YVdOaGJFRmpkR2wyYVhSNUxDQkVhV1YwVVhWaGJHbDBlU3dnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZOc1pXVndVWFZoYkdsMGVTd2dRV3hqYjJodmJFTnZibk4xYlhCMGFXOXVLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpYTmZkRzhnUFNCY0lsWmhjbWxoWW14bFhDSXNJSFpoYkhWbGMxOTBieUE5SUZ3aVZtRnNkV1ZjSWlrZ0pUNGxYRzRnSUNBZ2JYVjBZWFJsS0ZaaGNtbGhZbXhsSUQwZ1ptRmpkRzl5S0ZaaGNtbGhZbXhsTENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR1YyWld4eklEMGdZeWhjSWtKTlNWd2lMQ0JjSWxCb2VYTnBZMkZzUVdOMGFYWnBkSGxjSWl3Z1hDSkVhV1YwVVhWaGJHbDBlVndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpVTJ4bFpYQlJkV0ZzYVhSNVhDSXNJRndpUVd4amIyaHZiRU52Ym5OMWJYQjBhVzl1WENJcEtTbGNiaUFnWEc0Z0lHZG5jR3h2ZENod1lYSmhiR3hsYkY5c2IyNW5MQ0JoWlhNb2VDQTlJRlpoY21saFlteGxMQ0I1SUQwZ1ZtRnNkV1VzSUdkeWIzVndJRDBnVUdGMGFXVnVkRWxFS1NrZ0sxeHVJQ0FnSUdkbGIyMWZiR2x1WlNoaFpYTW9ZMjlzYjNJZ1BTQkVhV0ZuYm05emFYTXBMQ0JoYkhCb1lTQTlJREF1TXl3Z2MybDZaU0E5SURBdU5Ta2dLMXh1SUNBZ0lHZGxiMjFmY0c5cGJuUW9ZV1Z6S0dOdmJHOXlJRDBnUkdsaFoyNXZjMmx6S1N3Z1lXeHdhR0VnUFNBd0xqUXNJSE5wZW1VZ1BTQXhLU0FyWEc0Z0lDQWdjMk5oYkdWZlkyOXNiM0pmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENKT2J5QkRTMFJjSWlBOUlGd2lJekF3UWtFek9Gd2lMQ0JjSWtOTFJGd2lJRDBnWENJalJqZzNOalpFWENJcEtTQXJYRzRnSUNBZ2JHRmljeWgwYVhSc1pTQTlJRndpVUdWeVptbHNaWE1nWkdVZ1JYTjBhV3h2SUdSbElGWnBaR0VnS0ZCaGNtRnNiR1ZzSUVOdmIzSmthVzVoZEdWektWd2lMRnh1SUNBZ0lDQWdJQ0FnYzNWaWRHbDBiR1VnUFNCY0lrMTFaWE4wY21FZ1pHVWdNakF3SUhCaFkybGxiblJsY3lBdElGWmhjbWxoWW14bGN5QmxjM1JoYm1SaGNtbDZZV1JoYzF3aUxGeHVJQ0FnSUNBZ0lDQWdlU0E5SUZ3aVZtRnNiM0lnUlhOMFlXNWtZWEpwZW1Ga2J5QW9XaTF6WTI5eVpTbGNJaXhjYmlBZ0lDQWdJQ0FnSUhnZ1BTQmNJbHdpS1NBclhHNGdJQ0FnZEdobGJXVW9ZWGhwY3k1MFpYaDBMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9ZVzVuYkdVZ1BTQTBOU3dnYUdwMWMzUWdQU0F4S1N4Y2JpQWdJQ0FnSUNBZ0lDQndiRzkwTG5ScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtHaHFkWE4wSUQwZ01DNDFMQ0JtWVdObElEMGdYQ0ppYjJ4a1hDSXBMRnh1SUNBZ0lDQWdJQ0FnSUhCc2IzUXVjM1ZpZEdsMGJHVWdQU0JsYkdWdFpXNTBYM1JsZUhRb2FHcDFjM1FnUFNBd0xqVXBLVnh1ZlZ4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5wbG90X3BhcmFsbGVsX2Nvb3JkaW5hdGVzIDwtIGZ1bmN0aW9uKGRhdGEpIHtcbiAgcGFyYWxsZWxfZGF0YSA8LSBkYXRhICU+JVxuICAgIHNlbGVjdChQYXRpZW50SUQsIEJNSSwgUGh5c2ljYWxBY3Rpdml0eSwgRGlldFF1YWxpdHksIFNsZWVwUXVhbGl0eSxcbiAgICAgICAgICAgQWxjb2hvbENvbnN1bXB0aW9uLCBTbW9raW5nLCBEaWFnbm9zaXMpICU+JVxuICAgIG11dGF0ZShEaWFnbm9zaXMgPSBmYWN0b3IoRGlhZ25vc2lzLCBsYWJlbHMgPSBjKFxcTm8gQ0tEXFwsIFxcQ0tEXFwpKSkgJT4lXG4gICAgIyBFc3RhbmRhcml6YXIgdmFyaWFibGVzIHBhcmEgZXNjYWxhIGNvbcO6blxuICAgIG11dGF0ZShhY3Jvc3MoYyhCTUksIFBoeXNpY2FsQWN0aXZpdHksIERpZXRRdWFsaXR5LCBTbGVlcFF1YWxpdHksIFxuICAgICAgICAgICAgICAgICAgICBBbGNvaG9sQ29uc3VtcHRpb24pLCBzY2FsZSkpICU+JVxuICAgIHNhbXBsZV9uKDIwMCkgICMgTXVlc3RyYSBwYXJhIGNsYXJpZGFkIHZpc3VhbFxuICBcbiAgcGFyYWxsZWxfbG9uZyA8LSBwYXJhbGxlbF9kYXRhICU+JVxuICAgIHBpdm90X2xvbmdlcihjb2xzID0gYyhCTUksIFBoeXNpY2FsQWN0aXZpdHksIERpZXRRdWFsaXR5LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgU2xlZXBRdWFsaXR5LCBBbGNvaG9sQ29uc3VtcHRpb24pLFxuICAgICAgICAgICAgICAgICBuYW1lc190byA9IFxcVmFyaWFibGVcXCwgdmFsdWVzX3RvID0gXFxWYWx1ZVxcKSAlPiVcbiAgICBtdXRhdGUoVmFyaWFibGUgPSBmYWN0b3IoVmFyaWFibGUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKFxcQk1JXFwsIFxcUGh5c2ljYWxBY3Rpdml0eVxcLCBcXERpZXRRdWFsaXR5XFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxTbGVlcFF1YWxpdHlcXCwgXFxBbGNvaG9sQ29uc3VtcHRpb25cXCkpKVxuICBcbiAgZ2dwbG90KHBhcmFsbGVsX2xvbmcsIGFlcyh4ID0gVmFyaWFibGUsIHkgPSBWYWx1ZSwgZ3JvdXAgPSBQYXRpZW50SUQpKSArXG4gICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IERpYWdub3NpcyksIGFscGhhID0gMC4zLCBzaXplID0gMC41KSArXG4gICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBEaWFnbm9zaXMpLCBhbHBoYSA9IDAuNCwgc2l6ZSA9IDEpICtcbiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhcXE5vIENLRFxcID0gXFwjMDBCQTM4XFwsIFxcQ0tEXFwgPSBcXCNGODc2NkRcXCkpICtcbiAgICBsYWJzKHRpdGxlID0gXFxQZXJmaWxlcyBkZSBFc3RpbG8gZGUgVmlkYSAoUGFyYWxsZWwgQ29vcmRpbmF0ZXMpXFwsXG4gICAgICAgICBzdWJ0aXRsZSA9IFxcTXVlc3RyYSBkZSAyMDAgcGFjaWVudGVzIC0gVmFyaWFibGVzIGVzdGFuZGFyaXphZGFzXFwsXG4gICAgICAgICB5ID0gXFxWYWxvciBFc3RhbmRhcml6YWRvIChaLXNjb3JlKVxcLFxuICAgICAgICAgeCA9IFxcXFwpICtcbiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLFxuICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSBcXGJvbGRcXCksXG4gICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpXG59XG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
plot_parallel_coordinates <- function(data) {
  parallel_data <- data %>%
    select(PatientID, BMI, PhysicalActivity, DietQuality, SleepQuality,
           AlcoholConsumption, Smoking, Diagnosis) %>%
    mutate(Diagnosis = factor(Diagnosis, labels = c(\No CKD\, \CKD\))) %>%
    # Estandarizar variables para escala común
    mutate(across(c(BMI, PhysicalActivity, DietQuality, SleepQuality, 
                    AlcoholConsumption), scale)) %>%
    sample_n(200)  # Muestra para claridad visual
  
  parallel_long <- parallel_data %>%
    pivot_longer(cols = c(BMI, PhysicalActivity, DietQuality, 
                          SleepQuality, AlcoholConsumption),
                 names_to = \Variable\, values_to = \Value\) %>%
    mutate(Variable = factor(Variable, 
                             levels = c(\BMI\, \PhysicalActivity\, \DietQuality\,
                                        \SleepQuality\, \AlcoholConsumption\)))
  
  ggplot(parallel_long, aes(x = Variable, y = Value, group = PatientID)) +
    geom_line(aes(color = Diagnosis), alpha = 0.3, size = 0.5) +
    geom_point(aes(color = Diagnosis), alpha = 0.4, size = 1) +
    scale_color_manual(values = c(\No CKD\ = \#00BA38\, \CKD\ = \#F8766D\)) +
    labs(title = \Perfiles de Estilo de Vida (Parallel Coordinates)\,
         subtitle = \Muestra de 200 pacientes - Variables estandarizadas\,
         y = \Valor Estandarizado (Z-score)\,
         x = \\) +
    theme(axis.text.x = element_text(angle = 45, hjust = 1),
          plot.title = element_text(hjust = 0.5, face = \bold\),
          plot.subtitle = element_text(hjust = 0.5))
}



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dWNHeHZkRjl3WVhKaGJHeGxiRjlqYjI5eVpHbHVZWFJsY3lBOExTQm1kVzVqZEdsdmJpaGtZWFJoS1NCN1hHNGdJSEJoY21Gc2JHVnNYMlJoZEdFZ1BDMGdaR0YwWVNBbFBpVmNiaUFnSUNCelpXeGxZM1FvVUdGMGFXVnVkRWxFTENCQ1RVa3NJRkJvZVhOcFkyRnNRV04wYVhacGRIa3NJRVJwWlhSUmRXRnNhWFI1TENCVGJHVmxjRkYxWVd4cGRIa3NYRzRnSUNBZ0lDQWdJQ0FnSUVGc1kyOW9iMnhEYjI1emRXMXdkR2x2Yml3Z1UyMXZhMmx1Wnl3Z1JHbGhaMjV2YzJsektTQWxQaVZjYmlBZ0lDQnRkWFJoZEdVb1JHbGhaMjV2YzJseklEMGdabUZqZEc5eUtFUnBZV2R1YjNOcGN5d2diR0ZpWld4eklEMGdZeWhjWEU1dklFTkxSRnhjTENCY1hFTkxSRnhjS1NrcElDVStKVnh1SUNBZ0lDTWdSWE4wWVc1a1lYSnBlbUZ5SUhaaGNtbGhZbXhsY3lCd1lYSmhJR1Z6WTJGc1lTQmpiMjNEdW01Y2JpQWdJQ0J0ZFhSaGRHVW9ZV055YjNOektHTW9RazFKTENCUWFIbHphV05oYkVGamRHbDJhWFI1TENCRWFXVjBVWFZoYkdsMGVTd2dVMnhsWlhCUmRXRnNhWFI1TENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdRV3hqYjJodmJFTnZibk4xYlhCMGFXOXVLU3dnYzJOaGJHVXBLU0FsUGlWY2JpQWdJQ0J6WVcxd2JHVmZiaWd5TURBcElDQWpJRTExWlhOMGNtRWdjR0Z5WVNCamJHRnlhV1JoWkNCMmFYTjFZV3hjYmlBZ1hHNGdJSEJoY21Gc2JHVnNYMnh2Ym1jZ1BDMGdjR0Z5WVd4c1pXeGZaR0YwWVNBbFBpVmNiaUFnSUNCd2FYWnZkRjlzYjI1blpYSW9ZMjlzY3lBOUlHTW9RazFKTENCUWFIbHphV05oYkVGamRHbDJhWFI1TENCRWFXVjBVWFZoYkdsMGVTd2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRk5zWldWd1VYVmhiR2wwZVN3Z1FXeGpiMmh2YkVOdmJuTjFiWEIwYVc5dUtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlhOZmRHOGdQU0JjWEZaaGNtbGhZbXhsWEZ3c0lIWmhiSFZsYzE5MGJ5QTlJRnhjVm1Gc2RXVmNYQ2tnSlQ0bFhHNGdJQ0FnYlhWMFlYUmxLRlpoY21saFlteGxJRDBnWm1GamRHOXlLRlpoY21saFlteGxMQ0JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHVjJaV3h6SUQwZ1l5aGNYRUpOU1Z4Y0xDQmNYRkJvZVhOcFkyRnNRV04wYVhacGRIbGNYQ3dnWEZ4RWFXVjBVWFZoYkdsMGVWeGNMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGeGNVMnhsWlhCUmRXRnNhWFI1WEZ3c0lGeGNRV3hqYjJodmJFTnZibk4xYlhCMGFXOXVYRndwS1NsY2JpQWdYRzRnSUdkbmNHeHZkQ2h3WVhKaGJHeGxiRjlzYjI1bkxDQmhaWE1vZUNBOUlGWmhjbWxoWW14bExDQjVJRDBnVm1Gc2RXVXNJR2R5YjNWd0lEMGdVR0YwYVdWdWRFbEVLU2tnSzF4dUlDQWdJR2RsYjIxZmJHbHVaU2hoWlhNb1kyOXNiM0lnUFNCRWFXRm5ibTl6YVhNcExDQmhiSEJvWVNBOUlEQXVNeXdnYzJsNlpTQTlJREF1TlNrZ0sxeHVJQ0FnSUdkbGIyMWZjRzlwYm5Rb1lXVnpLR052Ykc5eUlEMGdSR2xoWjI1dmMybHpLU3dnWVd4d2FHRWdQU0F3TGpRc0lITnBlbVVnUFNBeEtTQXJYRzRnSUNBZ2MyTmhiR1ZmWTI5c2IzSmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YRnhPYnlCRFMwUmNYQ0E5SUZ4Y0l6QXdRa0V6T0Z4Y0xDQmNYRU5MUkZ4Y0lEMGdYRndqUmpnM05qWkVYRndwS1NBclhHNGdJQ0FnYkdGaWN5aDBhWFJzWlNBOUlGeGNVR1Z5Wm1sc1pYTWdaR1VnUlhOMGFXeHZJR1JsSUZacFpHRWdLRkJoY21Gc2JHVnNJRU52YjNKa2FXNWhkR1Z6S1Z4Y0xGeHVJQ0FnSUNBZ0lDQWdjM1ZpZEdsMGJHVWdQU0JjWEUxMVpYTjBjbUVnWkdVZ01qQXdJSEJoWTJsbGJuUmxjeUF0SUZaaGNtbGhZbXhsY3lCbGMzUmhibVJoY21sNllXUmhjMXhjTEZ4dUlDQWdJQ0FnSUNBZ2VTQTlJRnhjVm1Gc2IzSWdSWE4wWVc1a1lYSnBlbUZrYnlBb1dpMXpZMjl5WlNsY1hDeGNiaUFnSUNBZ0lDQWdJSGdnUFNCY1hGeGNLU0FyWEc0Z0lDQWdkR2hsYldVb1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1lXNW5iR1VnUFNBME5Td2dhR3AxYzNRZ1BTQXhLU3hjYmlBZ0lDQWdJQ0FnSUNCd2JHOTBMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0docWRYTjBJRDBnTUM0MUxDQm1ZV05sSUQwZ1hGeGliMnhrWEZ3cExGeHVJQ0FnSUNBZ0lDQWdJSEJzYjNRdWMzVmlkR2wwYkdVZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvYUdwMWMzUWdQU0F3TGpVcEtWeHVmVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxucGxvdF9wYXJhbGxlbF9jb29yZGluYXRlcyA8LSBmdW5jdGlvbihkYXRhKSB7XG4gIHBhcmFsbGVsX2RhdGEgPC0gZGF0YSAlPiVcbiAgICBzZWxlY3QoUGF0aWVudElELCBCTUksIFBoeXNpY2FsQWN0aXZpdHksIERpZXRRdWFsaXR5LCBTbGVlcFF1YWxpdHksXG4gICAgICAgICAgIEFsY29ob2xDb25zdW1wdGlvbiwgU21va2luZywgRGlhZ25vc2lzKSAlPiVcbiAgICBtdXRhdGUoRGlhZ25vc2lzID0gZmFjdG9yKERpYWdub3NpcywgbGFiZWxzID0gYyhcXE5vIENLRFxcLCBcXENLRFxcKSkpICU+JVxuICAgICMgRXN0YW5kYXJpemFyIHZhcmlhYmxlcyBwYXJhIGVzY2FsYSBjb23Dum5cbiAgICBtdXRhdGUoYWNyb3NzKGMoQk1JLCBQaHlzaWNhbEFjdGl2aXR5LCBEaWV0UXVhbGl0eSwgU2xlZXBRdWFsaXR5LCBcbiAgICAgICAgICAgICAgICAgICAgQWxjb2hvbENvbnN1bXB0aW9uKSwgc2NhbGUpKSAlPiVcbiAgICBzYW1wbGVfbigyMDApICAjIE11ZXN0cmEgcGFyYSBjbGFyaWRhZCB2aXN1YWxcbiAgXG4gIHBhcmFsbGVsX2xvbmcgPC0gcGFyYWxsZWxfZGF0YSAlPiVcbiAgICBwaXZvdF9sb25nZXIoY29scyA9IGMoQk1JLCBQaHlzaWNhbEFjdGl2aXR5LCBEaWV0UXVhbGl0eSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFNsZWVwUXVhbGl0eSwgQWxjb2hvbENvbnN1bXB0aW9uKSxcbiAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSBcXFZhcmlhYmxlXFwsIHZhbHVlc190byA9IFxcVmFsdWVcXCkgJT4lXG4gICAgbXV0YXRlKFZhcmlhYmxlID0gZmFjdG9yKFZhcmlhYmxlLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyhcXEJNSVxcLCBcXFBoeXNpY2FsQWN0aXZpdHlcXCwgXFxEaWV0UXVhbGl0eVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcU2xlZXBRdWFsaXR5XFwsIFxcQWxjb2hvbENvbnN1bXB0aW9uXFwpKSlcbiAgXG4gIGdncGxvdChwYXJhbGxlbF9sb25nLCBhZXMoeCA9IFZhcmlhYmxlLCB5ID0gVmFsdWUsIGdyb3VwID0gUGF0aWVudElEKSkgK1xuICAgIGdlb21fbGluZShhZXMoY29sb3IgPSBEaWFnbm9zaXMpLCBhbHBoYSA9IDAuMywgc2l6ZSA9IDAuNSkgK1xuICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gRGlhZ25vc2lzKSwgYWxwaGEgPSAwLjQsIHNpemUgPSAxKSArXG4gICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFxObyBDS0RcXCA9IFxcIzAwQkEzOFxcLCBcXENLRFxcID0gXFwjRjg3NjZEXFwpKSArXG4gICAgbGFicyh0aXRsZSA9IFxcUGVyZmlsZXMgZGUgRXN0aWxvIGRlIFZpZGEgKFBhcmFsbGVsIENvb3JkaW5hdGVzKVxcLFxuICAgICAgICAgc3VidGl0bGUgPSBcXE11ZXN0cmEgZGUgMjAwIHBhY2llbnRlcyAtIFZhcmlhYmxlcyBlc3RhbmRhcml6YWRhc1xcLFxuICAgICAgICAgeSA9IFxcVmFsb3IgRXN0YW5kYXJpemFkbyAoWi1zY29yZSlcXCxcbiAgICAgICAgIHggPSBcXFxcKSArXG4gICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSxcbiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gXFxib2xkXFwpLFxuICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKVxufVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucGxvdF9wYXJhbGxlbF9jb29yZGluYXRlcyA8LSBmdW5jdGlvbihkYXRhKSB7XG4gIHBhcmFsbGVsX2RhdGEgPC0gZGF0YSAlPiVcbiAgICBzZWxlY3QoUGF0aWVudElELCBCTUksIFBoeXNpY2FsQWN0aXZpdHksIERpZXRRdWFsaXR5LCBTbGVlcFF1YWxpdHksXG4gICAgICAgICAgIEFsY29ob2xDb25zdW1wdGlvbiwgU21va2luZywgRGlhZ25vc2lzKSAlPiVcbiAgICBtdXRhdGUoRGlhZ25vc2lzID0gZmFjdG9yKERpYWdub3NpcywgbGFiZWxzID0gYyhcXE5vIENLRFxcLCBcXENLRFxcKSkpICU+JVxuICAgICMgRXN0YW5kYXJpemFyIHZhcmlhYmxlcyBwYXJhIGVzY2FsYSBjb23Dum5cbiAgICBtdXRhdGUoYWNyb3NzKGMoQk1JLCBQaHlzaWNhbEFjdGl2aXR5LCBEaWV0UXVhbGl0eSwgU2xlZXBRdWFsaXR5LCBcbiAgICAgICAgICAgICAgICAgICAgQWxjb2hvbENvbnN1bXB0aW9uKSwgc2NhbGUpKSAlPiVcbiAgICBzYW1wbGVfbigyMDApICAjIE11ZXN0cmEgcGFyYSBjbGFyaWRhZCB2aXN1YWxcbiAgXG4gIHBhcmFsbGVsX2xvbmcgPC0gcGFyYWxsZWxfZGF0YSAlPiVcbiAgICBwaXZvdF9sb25nZXIoY29scyA9IGMoQk1JLCBQaHlzaWNhbEFjdGl2aXR5LCBEaWV0UXVhbGl0eSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFNsZWVwUXVhbGl0eSwgQWxjb2hvbENvbnN1bXB0aW9uKSxcbiAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSBcXFZhcmlhYmxlXFwsIHZhbHVlc190byA9IFxcVmFsdWVcXCkgJT4lXG4gICAgbXV0YXRlKFZhcmlhYmxlID0gZmFjdG9yKFZhcmlhYmxlLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyhcXEJNSVxcLCBcXFBoeXNpY2FsQWN0aXZpdHlcXCwgXFxEaWV0UXVhbGl0eVxcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcU2xlZXBRdWFsaXR5XFwsIFxcQWxjb2hvbENvbnN1bXB0aW9uXFwpKSlcbiAgXG4gIGdncGxvdChwYXJhbGxlbF9sb25nLCBhZXMoeCA9IFZhcmlhYmxlLCB5ID0gVmFsdWUsIGdyb3VwID0gUGF0aWVudElEKSkgK1xuICAgIGdlb21fbGluZShhZXMoY29sb3IgPSBEaWFnbm9zaXMpLCBhbHBoYSA9IDAuMywgc2l6ZSA9IDAuNSkgK1xuICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gRGlhZ25vc2lzKSwgYWxwaGEgPSAwLjQsIHNpemUgPSAxKSArXG4gICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXFxObyBDS0RcXCA9IFxcIzAwQkEzOFxcLCBcXENLRFxcID0gXFwjRjg3NjZEXFwpKSArXG4gICAgbGFicyh0aXRsZSA9IFxcUGVyZmlsZXMgZGUgRXN0aWxvIGRlIFZpZGEgKFBhcmFsbGVsIENvb3JkaW5hdGVzKVxcLFxuICAgICAgICAgc3VidGl0bGUgPSBcXE11ZXN0cmEgZGUgMjAwIHBhY2llbnRlcyAtIFZhcmlhYmxlcyBlc3RhbmRhcml6YWRhc1xcLFxuICAgICAgICAgeSA9IFxcVmFsb3IgRXN0YW5kYXJpemFkbyAoWi1zY29yZSlcXCxcbiAgICAgICAgIHggPSBcXFxcKSArXG4gICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSxcbiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gXFxib2xkXFwpLFxuICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKVxufVxuYGBgXG5gYGAifQ== -->

```r
```r
plot_parallel_coordinates <- function(data) {
  parallel_data <- data %>%
    select(PatientID, BMI, PhysicalActivity, DietQuality, SleepQuality,
           AlcoholConsumption, Smoking, Diagnosis) %>%
    mutate(Diagnosis = factor(Diagnosis, labels = c(\No CKD\, \CKD\))) %>%
    # Estandarizar variables para escala común
    mutate(across(c(BMI, PhysicalActivity, DietQuality, SleepQuality, 
                    AlcoholConsumption), scale)) %>%
    sample_n(200)  # Muestra para claridad visual
  
  parallel_long <- parallel_data %>%
    pivot_longer(cols = c(BMI, PhysicalActivity, DietQuality, 
                          SleepQuality, AlcoholConsumption),
                 names_to = \Variable\, values_to = \Value\) %>%
    mutate(Variable = factor(Variable, 
                             levels = c(\BMI\, \PhysicalActivity\, \DietQuality\,
                                        \SleepQuality\, \AlcoholConsumption\)))
  
  ggplot(parallel_long, aes(x = Variable, y = Value, group = PatientID)) +
    geom_line(aes(color = Diagnosis), alpha = 0.3, size = 0.5) +
    geom_point(aes(color = Diagnosis), alpha = 0.4, size = 1) +
    scale_color_manual(values = c(\No CKD\ = \#00BA38\, \CKD\ = \#F8766D\)) +
    labs(title = \Perfiles de Estilo de Vida (Parallel Coordinates)\,
         subtitle = \Muestra de 200 pacientes - Variables estandarizadas\,
         y = \Valor Estandarizado (Z-score)\,
         x = \\) +
    theme(axis.text.x = element_text(angle = 45, hjust = 1),
          plot.title = element_text(hjust = 0.5, face = \bold\),
          plot.subtitle = element_text(hjust = 0.5))
}
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjR3h2ZEY5a1pXMXZaM0poY0docFkxOWliM2h3Ykc5MGN5QThMU0JtZFc1amRHbHZiaWhrWVhSaEtTQjdYRzRnSUdSaGRHRmZaR1Z0YnlBOExTQmtZWFJoSUNVK0pWeHVJQ0FnSUcxMWRHRjBaU2hjYmlBZ0lDQWdJRWRsYm1SbGNpQTlJR1poWTNSdmNpaEhaVzVrWlhJc0lHeGhZbVZzY3lBOUlHTW9YQ0pOWVd4bFhDSXNJRndpUm1WdFlXeGxYQ0lwS1N4Y2JpQWdJQ0FnSUVWMGFHNXBZMmwwZVNBOUlHWmhZM1J2Y2loRmRHaHVhV05wZEhrc0lHeGhZbVZzY3lBOUlHTW9YQ0pEWVhWallYTnBZVzVjSWl3Z1hDSkJabkpwWTJGdUlFRnRaWEpwWTJGdVhDSXNJRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lrRnphV0Z1WENJc0lGd2lUM1JvWlhKY0lpa3BMRnh1SUNBZ0lDQWdVMjlqYVc5bFkyOXViMjFwWTFOMFlYUjFjeUE5SUdaaFkzUnZjaWhUYjJOcGIyVmpiMjV2YldsalUzUmhkSFZ6TENCY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHRmlaV3h6SUQwZ1l5aGNJa3h2ZDF3aUxDQmNJazFwWkdSc1pWd2lMQ0JjSWtocFoyaGNJaWtwWEc0Z0lDQWdLU0FsUGlWY2JpQWdJQ0J6Wld4bFkzUW9SMlZ1WkdWeUxDQkZkR2h1YVdOcGRIa3NJRk52WTJsdlpXTnZibTl0YVdOVGRHRjBkWE1zSUVkR1Vpd2dTR0pCTVdNc0lGeHVJQ0FnSUNBZ0lDQWdJQ0JUZVhOMGIyeHBZMEpRTENCUmRXRnNhWFI1VDJaTWFXWmxVMk52Y21VcElDVStKVnh1SUNBZ0lIQnBkbTkwWDJ4dmJtZGxjaWhqYjJ4eklEMGdZeWhIUmxJc0lFaGlRVEZqTENCVGVYTjBiMnhwWTBKUUxDQlJkV0ZzYVhSNVQyWk1hV1psVTJOdmNtVXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbGMxOTBieUE5SUZ3aVFtbHZiV0Z5YTJWeVhDSXNJSFpoYkhWbGMxOTBieUE5SUZ3aVZtRnNkV1ZjSWlsY2JpQWdYRzRnSUdkbmNHeHZkQ2hrWVhSaFgyUmxiVzhzSUdGbGN5aDRJRDBnVTI5amFXOWxZMjl1YjIxcFkxTjBZWFIxY3l3Z2VTQTlJRlpoYkhWbExDQm1hV3hzSUQwZ1IyVnVaR1Z5S1NrZ0sxeHVJQ0FnSUdkbGIyMWZZbTk0Y0d4dmRDaGhiSEJvWVNBOUlEQXVOeXdnYjNWMGJHbGxjaTV6YVhwbElEMGdNQzQxS1NBclhHNGdJQ0FnWm1GalpYUmZaM0pwWkNoQ2FXOXRZWEpyWlhJZ2ZpQkZkR2h1YVdOcGRIa3NJSE5qWVd4bGN5QTlJRndpWm5KbFpWOTVYQ0lwSUN0Y2JpQWdJQ0J6WTJGc1pWOW1hV3hzWDJKeVpYZGxjaWh3WVd4bGRIUmxJRDBnWENKVFpYUXlYQ0lwSUN0Y2JpQWdJQ0JzWVdKektIUnBkR3hsSUQwZ1hDSkNhVzl0WVhKallXUnZjbVZ6SUhCdmNpQkVaVzF2WjNKaFpzT3RZU0FvUjhPcGJtVnlieXdnUlhSdWFXTnBaR0ZrTENCRmMzUmhkSFZ6SUZOdlkybHZaV052YnNPemJXbGpieWxjSWl4Y2JpQWdJQ0FnSUNBZ0lIZ2dQU0JjSWtWemRHRjBkWE1nVTI5amFXOWxZMjl1dzdOdGFXTnZYQ0lzWEc0Z0lDQWdJQ0FnSUNCNUlEMGdYQ0pXWVd4dmNpQmtaV3dnUW1sdmJXRnlZMkZrYjNKY0lpa2dLMXh1SUNBZ0lIUm9aVzFsS0hOMGNtbHdMblJsZUhRZ1BTQmxiR1Z0Wlc1MFgzUmxlSFFvWm1GalpTQTlJRndpWW05c1pGd2lMQ0J6YVhwbElEMGdPQ2tzWEc0Z0lDQWdJQ0FnSUNBZ1lYaHBjeTUwWlhoMExuZ2dQU0JsYkdWdFpXNTBYM1JsZUhRb1lXNW5iR1VnUFNBME5Td2dhR3AxYzNRZ1BTQXhLU3hjYmlBZ0lDQWdJQ0FnSUNCd2JHOTBMblJwZEd4bElEMGdaV3hsYldWdWRGOTBaWGgwS0docWRYTjBJRDBnTUM0MUxDQm1ZV05sSUQwZ1hDSmliMnhrWENJc0lITnBlbVVnUFNBeE1Ta3BYRzU5WEc1Z1lHQWlmUT09IC0tPlxuXG5gYGByXG5wbG90X2RlbW9ncmFwaGljX2JveHBsb3RzIDwtIGZ1bmN0aW9uKGRhdGEpIHtcbiAgZGF0YV9kZW1vIDwtIGRhdGEgJT4lXG4gICAgbXV0YXRlKFxuICAgICAgR2VuZGVyID0gZmFjdG9yKEdlbmRlciwgbGFiZWxzID0gYyhcXE1hbGVcXCwgXFxGZW1hbGVcXCkpLFxuICAgICAgRXRobmljaXR5ID0gZmFjdG9yKEV0aG5pY2l0eSwgbGFiZWxzID0gYyhcXENhdWNhc2lhblxcLCBcXEFmcmljYW4gQW1lcmljYW5cXCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcQXNpYW5cXCwgXFxPdGhlclxcKSksXG4gICAgICBTb2Npb2Vjb25vbWljU3RhdHVzID0gZmFjdG9yKFNvY2lvZWNvbm9taWNTdGF0dXMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKFxcTG93XFwsIFxcTWlkZGxlXFwsIFxcSGlnaFxcKSlcbiAgICApICU+JVxuICAgIHNlbGVjdChHZW5kZXIsIEV0aG5pY2l0eSwgU29jaW9lY29ub21pY1N0YXR1cywgR0ZSLCBIYkExYywgXG4gICAgICAgICAgIFN5c3RvbGljQlAsIFF1YWxpdHlPZkxpZmVTY29yZSkgJT4lXG4gICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKEdGUiwgSGJBMWMsIFN5c3RvbGljQlAsIFF1YWxpdHlPZkxpZmVTY29yZSksXG4gICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gXFxCaW9tYXJrZXJcXCwgdmFsdWVzX3RvID0gXFxWYWx1ZVxcKVxuICBcbiAgZ2dwbG90KGRhdGFfZGVtbywgYWVzKHggPSBTb2Npb2Vjb25vbWljU3RhdHVzLCB5ID0gVmFsdWUsIGZpbGwgPSBHZW5kZXIpKSArXG4gICAgZ2VvbV9ib3hwbG90KGFscGhhID0gMC43LCBvdXRsaWVyLnNpemUgPSAwLjUpICtcbiAgICBmYWNldF9ncmlkKEJpb21hcmtlciB+IEV0aG5pY2l0eSwgc2NhbGVzID0gXFxmcmVlX3lcXCkgK1xuICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSBcXFNldDJcXCkgK1xuICAgIGxhYnModGl0bGUgPSBcXEJpb21hcmNhZG9yZXMgcG9yIERlbW9ncmFmw61hIChHw6luZXJvXG4ifQ== -->
plot_demographic_boxplots <- function(data) {
  data_demo <- data %>%
    mutate(
      Gender = factor(Gender, labels = c(\Male\, \Female\)),
      Ethnicity = factor(Ethnicity, labels = c(\Caucasian\, \African American\, 
                                               \Asian\, \Other\)),
      SocioeconomicStatus = factor(SocioeconomicStatus, 
                                   labels = c(\Low\, \Middle\, \High\))
    ) %>%
    select(Gender, Ethnicity, SocioeconomicStatus, GFR, HbA1c, 
           SystolicBP, QualityOfLifeScore) %>%
    pivot_longer(cols = c(GFR, HbA1c, SystolicBP, QualityOfLifeScore),
                 names_to = \Biomarker\, values_to = \Value\)
  
  ggplot(data_demo, aes(x = SocioeconomicStatus, y = Value, fill = Gender)) +
    geom_boxplot(alpha = 0.7, outlier.size = 0.5) +
    facet_grid(Biomarker ~ Ethnicity, scales = \free_y\) +
    scale_fill_brewer(palette = \Set2\) +
    labs(title = \Biomarcadores por Demografía (Género
```r
plot_demographic_boxplots <- function(data) {
  data_demo <- data %>%
    mutate(
      Gender = factor(Gender, labels = c(\Male\, \Female\)),
      Ethnicity = factor(Ethnicity, labels = c(\Caucasian\, \African American\, 
                                               \Asian\, \Other\)),
      SocioeconomicStatus = factor(SocioeconomicStatus, 
                                   labels = c(\Low\, \Middle\, \High\))
    ) %>%
    select(Gender, Ethnicity, SocioeconomicStatus, GFR, HbA1c, 
           SystolicBP, QualityOfLifeScore) %>%
    pivot_longer(cols = c(GFR, HbA1c, SystolicBP, QualityOfLifeScore),
                 names_to = \Biomarker\, values_to = \Value\)
  
  ggplot(data_demo, aes(x = SocioeconomicStatus, y = Value, fill = Gender)) +
    geom_boxplot(alpha = 0.7, outlier.size = 0.5) +
    facet_grid(Biomarker ~ Ethnicity, scales = \free_y\) +
    scale_fill_brewer(palette = \Set2\) +
    labs(title = \Biomarcadores por Demografía (Género

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGxvdF9xb2xfYnViYmxlIDwtIGZ1bmN0aW9uKGRhdGEpIHtcbiAgYnViYmxlX2RhdGEgPC0gZGF0YSAlPiVcbiAgICBtdXRhdGUoXG4gICAgICBTZXZlcml0eV9TY29yZSA9IChTZXJ1bUNyZWF0aW5pbmUgLSBtaW4oU2VydW1DcmVhdGluaW5lKSkgLyBcbiAgICAgICAgKG1heChTZXJ1bUNyZWF0aW5pbmUpIC0gbWluKFNlcnVtQ3JlYXRpbmluZSkpICogMTAsXG4gICAgICBEaWFnbm9zaXMgPSBmYWN0b3IoRGlhZ25vc2lzLCBsYWJlbHMgPSBjKFwiTm8gQ0tEXCIsIFwiQ0tEXCIpKVxuICAgIClcbiAgXG4gIGdncGxvdChidWJibGVfZGF0YSwgYWVzKHggPSBGYXRpZ3VlTGV2ZWxzLCB5ID0gUXVhbGl0eU9mTGlmZVNjb3JlKSkgK1xuICAgIGdlb21fcG9pbnQoYWVzKHNpemUgPSBTZXZlcml0eV9TY29yZSwgY29sb3IgPSBHRlIsIHNoYXBlID0gRGlhZ25vc2lzKSwgXG4gICAgICAgICAgICAgICBhbHBoYSA9IDAuNikgK1xuICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gXCJtYWdtYVwiLCBkaXJlY3Rpb24gPSAtMSwgXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gXCJHRlJcXG4obUwvbWluLzEuNzNtwrIpXCIpICtcbiAgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDEwKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBcIlNldmVyaWRhZFxcbihDcmVhdGluaW5hKVwiKSArXG4gICAgZ2VvbV9zbW9vdGgoYWVzKGNvbG9yID0gTlVMTCwgc2l6ZSA9IE5VTEwpLCBtZXRob2QgPSBcImxtXCIsIFxuICAgICAgICAgICAgICAgIHNlID0gVFJVRSwgY29sb3IgPSBcImJsYWNrXCIsIGxpbmV0eXBlID0gXCJkYXNoZWRcIikgK1xuICAgIGxhYnModGl0bGUgPSBcIkNhbGlkYWQgZGUgVmlkYSB2cyBGYXRpZ2EgKHRhbWHDsW8gPSBTZXZlcmlkYWQsIGNvbG9yID0gR0ZSKVwiLFxuICAgICAgICAgeCA9IFwiTml2ZWwgZGUgRmF0aWdhICgwLTEwKVwiLFxuICAgICAgICAgeSA9IFwiU2NvcmUgZGUgQ2FsaWRhZCBkZSBWaWRhICgwLTEwMClcIikgK1xuICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSBcImJvbGRcIiksXG4gICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gXCJyaWdodFwiKVxufVxuYGBgIn0= -->

```r
plot_qol_bubble <- function(data) {
  bubble_data <- data %>%
    mutate(
      Severity_Score = (SerumCreatinine - min(SerumCreatinine)) / 
        (max(SerumCreatinine) - min(SerumCreatinine)) * 10,
      Diagnosis = factor(Diagnosis, labels = c(\No CKD\, \CKD\))
    )
  
  ggplot(bubble_data, aes(x = FatigueLevels, y = QualityOfLifeScore)) +
    geom_point(aes(size = Severity_Score, color = GFR, shape = Diagnosis), 
               alpha = 0.6) +
    scale_color_viridis(option = \magma\, direction = -1, 
                        name = \GFR\n(mL/min/1.73m²)\) +
    scale_size_continuous(range = c(1, 10), 
                          name = \Severidad\n(Creatinina)\) +
    geom_smooth(aes(color = NULL, size = NULL), method = \lm\, 
                se = TRUE, color = \black\, linetype = \dashed\) +
    labs(title = \Calidad de Vida vs Fatiga (tamaño = Severidad
```r
plot_qol_bubble <- function(data) {
  bubble_data <- data %>%
    mutate(
      Severity_Score = (SerumCreatinine - min(SerumCreatinine)) / 
        (max(SerumCreatinine) - min(SerumCreatinine)) * 10,
      Diagnosis = factor(Diagnosis, labels = c(\No CKD\, \CKD\))
    )
  
  ggplot(bubble_data, aes(x = FatigueLevels, y = QualityOfLifeScore)) +
    geom_point(aes(size = Severity_Score, color = GFR, shape = Diagnosis), 
               alpha = 0.6) +
    scale_color_viridis(option = \magma\, direction = -1, 
                        name = \GFR\n(mL/min/1.73m²)\) +
    scale_size_continuous(range = c(1, 10), 
                          name = \Severidad\n(Creatinina)\) +
    geom_smooth(aes(color = NULL, size = NULL), method = \lm\, 
                se = TRUE, color = \black\, linetype = \dashed\) +
    labs(title = \Calidad de Vida vs Fatiga (tamaño = Severidad

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGxvdF9tZWRpY2F0aW9uX3Zpb2xpbnMgPC0gZnVuY3Rpb24oZGF0YSkge1xuICBtZWRfZGF0YSA8LSBkYXRhICU+JVxuICAgIG11dGF0ZShcbiAgICAgIFRyZWF0bWVudF9JbnRlbnNpdHkgPSBBQ0VJbmhpYml0b3JzICsgRGl1cmV0aWNzICsgU3RhdGlucyArIFxuICAgICAgICBBbnRpZGlhYmV0aWNNZWRpY2F0aW9ucyxcbiAgICAgIFRyZWF0bWVudF9Hcm91cCA9IGNhc2Vfd2hlbihcbiAgICAgICAgVHJlYXRtZW50X0ludGVuc2l0eSA9PSAwIH4gXCJObyBNZWRzXCIsXG4gICAgICAgIFRyZWF0bWVudF9JbnRlbnNpdHkgPD0gMiB+IFwiTG93ICgxLTIpXCIsXG4gICAgICAgIFRSVUUgfiBcIkhpZ2ggKDMtNClcIlxuICAgICAgKSxcbiAgICAgIFRyZWF0bWVudF9Hcm91cCA9IGZhY3RvcihUcmVhdG1lbnRfR3JvdXAsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoXCJObyBNZWRzXCIsIFwiTG93ICgxLTIpXCIsIFwiSGlnaCAoMy00KVwiKSlcbiAgICApICU+JVxuICAgIHNlbGVjdChUcmVhdG1lbnRfR3JvdXAsIEdGUiwgSGJBMWMsIFN5c3RvbGljQlAsIFF1YWxpdHlPZkxpZmVTY29yZSkgJT4lXG4gICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKEdGUiwgSGJBMWMsIFN5c3RvbGljQlAsIFF1YWxpdHlPZkxpZmVTY29yZSksXG4gICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gXCJPdXRjb21lXCIsIHZhbHVlc190byA9IFwiVmFsdWVcIilcbiAgXG4gIGdncGxvdChtZWRfZGF0YSwgYWVzKHggPSBUcmVhdG1lbnRfR3JvdXAsIHkgPSBWYWx1ZSwgZmlsbCA9IFRyZWF0bWVudF9Hcm91cCkpICtcbiAgICBnZW9tX3Zpb2xpbihhbHBoYSA9IDAuNywgdHJpbSA9IEZBTFNFKSArXG4gICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuOCwgb3V0bGllci5zaXplID0gMC41KSArXG4gICAgZmFjZXRfd3JhcCh+IE91dGNvbWUsIHNjYWxlcyA9IFwiZnJlZV95XCIsIG5jb2wgPSAyKSArXG4gICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9IFwiWWxPclJkXCIpICtcbiAgICBsYWJzKHRpdGxlID0gXCJEaXN0cmlidWNpw7NuIGRlIE91dGNvbWVzIENsw61uaWNvcyBwb3IgSW50ZW5zaWRhZCBkZSBUcmF0YW1pZW50b1wiLFxuICAgICAgICAgc3VidGl0bGUgPSBcIkludGVuc2lkYWQgPSBzdW1hIGRlIG1lZGljYW1lbnRvcyBjbGF2ZSAoQUNFaSwgRGl1csOpdGljbywgRXN0YXRpbmEsIEFudGlkaWFiw6l0aWNvKVwiLFxuICAgICAgICAgeCA9IFwiR3J1cG8gZGUgVHJhdGFtaWVudG9cIixcbiAgICAgICAgIHkgPSBcIlZhbG9yIGRlbCBPdXRjb21lXCIsXG4gICAgICAgICBmaWxsID0gXCJJbnRlbnNpZGFkXCIpICtcbiAgICB0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSBcImJvbGRcIiksXG4gICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSxcbiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gXCJib2xkXCIpLFxuICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSA5KSlcbn1cbmBgYCJ9 -->

```r
plot_medication_violins <- function(data) {
  med_data <- data %>%
    mutate(
      Treatment_Intensity = ACEInhibitors + Diuretics + Statins + 
        AntidiabeticMedications,
      Treatment_Group = case_when(
        Treatment_Intensity == 0 ~ \No Meds\,
        Treatment_Intensity <= 2 ~ \Low (1-2)\,
        TRUE ~ \High (3-4)\
      ),
      Treatment_Group = factor(Treatment_Group, 
                               levels = c(\No Meds\, \Low (1-2)\, \High (3-4)\))
    ) %>%
    select(Treatment_Group, GFR, HbA1c, SystolicBP, QualityOfLifeScore) %>%
    pivot_longer(cols = c(GFR, HbA1c, SystolicBP, QualityOfLifeScore),
                 names_to = \Outcome\, values_to = \Value\)
  
  ggplot(med_data, aes(x = Treatment_Group, y = Value, fill = Treatment_Group)) +
    geom_violin(alpha = 0.7, trim = FALSE) +
    geom_boxplot(width = 0.2, alpha = 0.8, outlier.size = 0.5) +
    facet_wrap(~ Outcome, scales = \free_y\, ncol = 2) +
    scale_fill_brewer(palette = \YlOrRd\) +
    labs(title = \Distribución de Outcomes Clínicos por Intensidad de Tratamiento\,
         subtitle = \Intensidad = suma de medicamentos clave (ACEi
```r
plot_medication_violins <- function(data) {
  med_data <- data %>%
    mutate(
      Treatment_Intensity = ACEInhibitors + Diuretics + Statins + 
        AntidiabeticMedications,
      Treatment_Group = case_when(
        Treatment_Intensity == 0 ~ \No Meds\,
        Treatment_Intensity <= 2 ~ \Low (1-2)\,
        TRUE ~ \High (3-4)\
      ),
      Treatment_Group = factor(Treatment_Group, 
                               levels = c(\No Meds\, \Low (1-2)\, \High (3-4)\))
    ) %>%
    select(Treatment_Group, GFR, HbA1c, SystolicBP, QualityOfLifeScore) %>%
    pivot_longer(cols = c(GFR, HbA1c, SystolicBP, QualityOfLifeScore),
                 names_to = \Outcome\, values_to = \Value\)
  
  ggplot(med_data, aes(x = Treatment_Group, y = Value, fill = Treatment_Group)) +
    geom_violin(alpha = 0.7, trim = FALSE) +
    geom_boxplot(width = 0.2, alpha = 0.8, outlier.size = 0.5) +
    facet_wrap(~ Outcome, scales = \free_y\, ncol = 2) +
    scale_fill_brewer(palette = \YlOrRd\) +
    labs(title = \Distribución de Outcomes Clínicos por Intensidad de Tratamiento\,
         subtitle = \Intensidad = suma de medicamentos clave (ACEi

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGxvdF9kZW5zaXR5X2NvbnRvdXIgPC0gZnVuY3Rpb24oZGF0YSkge1xuICBkYXRhX2NvbnRvdXIgPC0gZGF0YSAlPiVcbiAgICBtdXRhdGUoRGlhZ25vc2lzID0gZmFjdG9yKERpYWdub3NpcywgbGFiZWxzID0gYyhcIk5vIENLRFwiLCBcIkNLRFwiKSkpXG4gIFxuICBnZ3Bsb3QoZGF0YV9jb250b3VyLCBhZXMoeCA9IEhiQTFjLCB5ID0gR0ZSKSkgK1xuICAgIHN0YXRfZGVuc2l0eV8yZChhZXMoZmlsbCA9IGFmdGVyX3N0YXQobGV2ZWwpKSwgZ2VvbSA9IFwicG9seWdvblwiLCBhbHBoYSA9IDAuNSkgK1xuICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gRGlhZ25vc2lzKSwgYWxwaGEgPSAwLjMsIHNpemUgPSAxKSArXG4gICAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9IFwiY2l2aWRpc1wiLCBuYW1lID0gXCJEZW5zaWRhZFwiKSArXG4gICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoXCJObyBDS0RcIiA9IFwiIzAwQkEzOFwiLCBcIkNLRFwiID0gXCIjRjg3NjZEXCIpKSArXG4gICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gNjAsIGxpbmV0eXBlID0gXCJkYXNoZWRcIiwgY29sb3IgPSBcInJlZFwiLCBzaXplID0gMC44KSArXG4gICAgYW5ub3RhdGUoXCJ0ZXh0XCIsIHggPSA5LCB5ID0gNjUsIGxhYmVsID0gXCJHRlIgPSA2MCAodW1icmFsIENLRClcIiwgXG4gICAgICAgICAgICAgY29sb3IgPSBcInJlZFwiLCBzaXplID0gMykgK1xuICAgIGxhYnModGl0bGUgPSBcIkNvbnRvcm5vIGRlIERlbnNpZGFkOiBHRlIgdnMgSGJBMWNcIixcbiAgICAgICAgIHN1YnRpdGxlID0gXCJJZGVudGlmaWNhY2nDs24gZGUgY2x1c3RlcnMgZGUgcmllc2dvIG1ldGFiw7NsaWNvLXJlbmFsXCIsXG4gICAgICAgICB4ID0gXCJIYkExYyAoJSlcIixcbiAgICAgICAgIHkgPSBcIkdGUiAobUwvbWluLzEuNzNtwrIpXCIpICtcbiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gXCJib2xkXCIpLFxuICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKVxufVxuYGBgIn0= -->

```r
plot_density_contour <- function(data) {
  data_contour <- data %>%
    mutate(Diagnosis = factor(Diagnosis, labels = c(\No CKD\, \CKD\)))
  
  ggplot(data_contour, aes(x = HbA1c, y = GFR)) +
    stat_density_2d(aes(fill = after_stat(level)), geom = \polygon\, alpha = 0.5) +
    geom_point(aes(color = Diagnosis), alpha = 0.3, size = 1) +
    scale_fill_viridis(option = \cividis\, name = \Densidad\) +
    scale_color_manual(values = c(\No CKD\ = \#00BA38\, \CKD\ = \#F8766D\)) +
    geom_hline(yintercept = 60, linetype = \dashed\, color = \red\, size = 0.8) +
    annotate(\text\, x = 9, y = 65, label = \GFR = 60 (umbral CKD)\, 
             color = \red\, size = 3) +
    labs(title = \Contorno de Densidad: GFR vs HbA1c\,
         subtitle = \Identificación de clusters de riesgo metabólico-renal\,
         x = \HbA1c (%)\,
         y = \GFR (mL/min/1.73m²)\) +
    theme(plot.title = element_text(hjust = 0.5, face = \bold\),
          plot.subtitle = element_text(hjust = 0.5))
}
```

<!-- rnb-source-end -->
```r
plot_density_contour <- function(data) {
  data_contour <- data %>%
    mutate(Diagnosis = factor(Diagnosis, labels = c(\No CKD\, \CKD\)))
  
  ggplot(data_contour, aes(x = HbA1c, y = GFR)) +
    stat_density_2d(aes(fill = after_stat(level)), geom = \polygon\, alpha = 0.5) +
    geom_point(aes(color = Diagnosis), alpha = 0.3, size = 1) +
    scale_fill_viridis(option = \cividis\, name = \Densidad\) +
    scale_color_manual(values = c(\No CKD\ = \#00BA38\, \CKD\ = \#F8766D\)) +
    geom_hline(yintercept = 60, linetype = \dashed\, color = \red\, size = 0.8) +
    annotate(\text\, x = 9, y = 65, label = \GFR = 60 (umbral CKD)\, 
             color = \red\, size = 3) +
    labs(title = \Contorno de Densidad: GFR vs HbA1c\,
         subtitle = \Identificación de clusters de riesgo metabólico-renal\,
         x = \HbA1c (%)\,
         y = \GFR (mL/min/1.73m²)\) +
    theme(plot.title = element_text(hjust = 0.5, face = \bold\),
          plot.subtitle = element_text(hjust = 0.5))
}

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVjR3h2ZEY5aFoyVmZjbWxrWjJWeklEd3RJR1oxYm1OMGFXOXVLR1JoZEdFcElIdGNiaUFnYkdsaWNtRnllU2huWjNKcFpHZGxjeWxjYmlBZ1hHNGdJSEpwWkdkbFgyUmhkR0VnUEMwZ1pHRjBZU0FsUGlWY2JpQWdJQ0J0ZFhSaGRHVW9YRzRnSUNBZ0lDQkRiMjF2Y21KcFpHbDBlVjlRY205bWFXeGxJRDBnWTJGelpWOTNhR1Z1S0Z4dUlDQWdJQ0FnSUNCR1lXMXBiSGxJYVhOMGIzSjVSR2xoWW1WMFpYTWdQVDBnTVNBbUlFWmhiV2xzZVVocGMzUnZjbmxJZVhCbGNuUmxibk5wYjI0Z1BUMGdNU0IrSUZ4dUlDQWdJQ0FnSUNBZ0lGd2lSR2xoWW1WMFpYTWdLeUJJVkU1Y0lpeGNiaUFnSUNBZ0lDQWdSbUZ0YVd4NVNHbHpkRzl5ZVVScFlXSmxkR1Z6SUQwOUlERWdmaUJjSWtScFlXSmxkR1Z6SUU5dWJIbGNJaXhjYmlBZ0lDQWdJQ0FnUm1GdGFXeDVTR2x6ZEc5eWVVaDVjR1Z5ZEdWdWMybHZiaUE5UFNBeElINGdYQ0pJVkU0Z1QyNXNlVndpTEZ4dUlDQWdJQ0FnSUNCR1lXMXBiSGxJYVhOMGIzSjVTMmxrYm1WNVJHbHpaV0Z6WlNBOVBTQXhJSDRnWENKTGFXUnVaWGtnUkdselpXRnpaVndpTEZ4dUlDQWdJQ0FnSUNCVVVsVkZJSDRnWENKT2IyNWxYQ0pjYmlBZ0lDQWdJQ2xjYmlBZ0lDQXBJQ1UrSlZ4dUlDQWdJR1pwYkhSbGNpaERiMjF2Y21KcFpHbDBlVjlRY205bWFXeGxJQ0U5SUZ3aVRtOXVaVndpS1Z4dUlDQmNiaUFnWjJkd2JHOTBLSEpwWkdkbFgyUmhkR0VzSUdGbGN5aDRJRDBnUVdkbExDQjVJRDBnUTI5dGIzSmlhV1JwZEhsZlVISnZabWxzWlN3Z1ptbHNiQ0E5SUVOdmJXOXlZbWxrYVhSNVgxQnliMlpwYkdVcEtTQXJYRzRnSUNBZ1oyVnZiVjlrWlc1emFYUjVYM0pwWkdkbGN5aGhiSEJvWVNBOUlEQXVOeXdnYzJOaGJHVWdQU0F4TGpVcElDdGNiaUFnSUNCelkyRnNaVjltYVd4c1gzWnBjbWxrYVhNb1pHbHpZM0psZEdVZ1BTQlVVbFZGTENCdmNIUnBiMjRnUFNCY0luUjFjbUp2WENJcElDdGNiaUFnSUNCc1lXSnpLSFJwZEd4bElEMGdYQ0pFYVhOMGNtbGlkV05wdzdOdUlHUmxJRVZrWVdRZ2MyVm53N3B1SUVocGMzUnZjbWxoSUVaaGJXbHNhV0Z5SUdSbElFTnZiVzl5WW1sc2FXUmhaR1Z6WENJc1hHNGdJQ0FnSUNBZ0lDQjRJRDBnWENKRlpHRmtJQ2hodzdGdmN5bGNJaXhjYmlBZ0lDQWdJQ0FnSUhrZ1BTQmNJbEJsY21acGJDQmtaU0JEYjIxdmNtSnBiR2xrWVdRZ1JtRnRhV3hwWVhKY0lpa2dLMXh1SUNBZ0lIUm9aVzFsWDNKcFpHZGxjeWdwSUN0Y2JpQWdJQ0IwYUdWdFpTaHNaV2RsYm1RdWNHOXphWFJwYjI0Z1BTQmNJbTV2Ym1WY0lpeGNiaUFnSUNBZ0lDQWdJQ0J3Ykc5MExuUnBkR3hsSUQwZ1pXeGxiV1Z1ZEY5MFpYaDBLR2hxZFhOMElEMGdNQzQxTENCbVlXTmxJRDBnWENKaWIyeGtYQ0lwS1Z4dWZWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxucGxvdF9hZ2VfcmlkZ2VzIDwtIGZ1bmN0aW9uKGRhdGEpIHtcbiAgbGlicmFyeShnZ3JpZGdlcylcbiAgXG4gIHJpZGdlX2RhdGEgPC0gZGF0YSAlPiVcbiAgICBtdXRhdGUoXG4gICAgICBDb21vcmJpZGl0eV9Qcm9maWxlID0gY2FzZV93aGVuKFxuICAgICAgICBGYW1pbHlIaXN0b3J5RGlhYmV0ZXMgPT0gMSAmIEZhbWlseUhpc3RvcnlIeXBlcnRlbnNpb24gPT0gMSB+IFxuICAgICAgICAgIFxcRGlhYmV0ZXMgKyBIVE5cXCxcbiAgICAgICAgRmFtaWx5SGlzdG9yeURpYWJldGVzID09IDEgfiBcXERpYWJldGVzIE9ubHlcXCxcbiAgICAgICAgRmFtaWx5SGlzdG9yeUh5cGVydGVuc2lvbiA9PSAxIH4gXFxIVE4gT25seVxcLFxuICAgICAgICBGYW1pbHlIaXN0b3J5S2lkbmV5RGlzZWFzZSA9PSAxIH4gXFxLaWRuZXkgRGlzZWFzZVxcLFxuICAgICAgICBUUlVFIH4gXFxOb25lXFxcbiAgICAgIClcbiAgICApICU+JVxuICAgIGZpbHRlcihDb21vcmJpZGl0eV9Qcm9maWxlICE9IFxcTm9uZVxcKVxuICBcbiAgZ2dwbG90KHJpZGdlX2RhdGEsIGFlcyh4ID0gQWdlLCB5ID0gQ29tb3JiaWRpdHlfUHJvZmlsZSwgZmlsbCA9IENvbW9yYmlkaXR5X1Byb2ZpbGUpKSArXG4gICAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhhbHBoYSA9IDAuNywgc2NhbGUgPSAxLjUpICtcbiAgICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSBcXHR1cmJvXFwpICtcbiAgICBsYWJzKHRpdGxlID0gXFxEaXN0cmlidWNpw7NuIGRlIEVkYWQgc2Vnw7puIEhpc3RvcmlhIEZhbWlsaWFyIGRlIENvbW9yYmlsaWRhZGVzXFwsXG4gICAgICAgICB4ID0gXFxFZGFkIChhw7FvcylcXCxcbiAgICAgICAgIHkgPSBcXFBlcmZpbCBkZSBDb21vcmJpbGlkYWQgRmFtaWxpYXJcXCkgK1xuICAgIHRoZW1lX3JpZGdlcygpICtcbiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCxcbiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gXFxib2xkXFwpKVxufVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
plot_age_ridges <- function(data) {
  library(ggridges)
  
  ridge_data <- data %>%
    mutate(
      Comorbidity_Profile = case_when(
        FamilyHistoryDiabetes == 1 & FamilyHistoryHypertension == 1 ~ 
          \Diabetes + HTN\,
        FamilyHistoryDiabetes == 1 ~ \Diabetes Only\,
        FamilyHistoryHypertension == 1 ~ \HTN Only\,
        FamilyHistoryKidneyDisease == 1 ~ \Kidney Disease\,
        TRUE ~ \None\
      )
    ) %>%
    filter(Comorbidity_Profile != \None\)
  
  ggplot(ridge_data, aes(x = Age, y = Comorbidity_Profile, fill = Comorbidity_Profile)) +
    geom_density_ridges(alpha = 0.7, scale = 1.5) +
    scale_fill_viridis(discrete = TRUE, option = \turbo\) +
    labs(title = \Distribución de Edad según Historia Familiar de Comorbilidades\,
         x = \Edad (años)\,
         y = \Perfil de Comorbilidad Familiar\) +
    theme_ridges() +
    theme(legend.position = \none\,
          plot.title = element_text(hjust = 0.5, face = \bold\))
}

````

```r
plot_age_ridges <- function(data) {
  library(ggridges)
  
  ridge_data <- data %>%
    mutate(
      Comorbidity_Profile = case_when(
        FamilyHistoryDiabetes == 1 & FamilyHistoryHypertension == 1 ~ 
          \Diabetes + HTN\,
        FamilyHistoryDiabetes == 1 ~ \Diabetes Only\,
        FamilyHistoryHypertension == 1 ~ \HTN Only\,
        FamilyHistoryKidneyDisease == 1 ~ \Kidney Disease\,
        TRUE ~ \None\
      )
    ) %>%
    filter(Comorbidity_Profile != \None\)
  
  ggplot(ridge_data, aes(x = Age, y = Comorbidity_Profile, fill = Comorbidity_Profile)) +
    geom_density_ridges(alpha = 0.7, scale = 1.5) +
    scale_fill_viridis(discrete = TRUE, option = \turbo\) +
    labs(title = \Distribución de Edad según Historia Familiar de Comorbilidades\,
         x = \Edad (años)\,
         y = \Perfil de Comorbilidad Familiar\) +
    theme_ridges() +
    theme(legend.position = \none\,
          plot.title = element_text(hjust = 0.5, face = \bold\))
}

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-chunk-begin -->



<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->



<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->



<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->



<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->



<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->



<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->



<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->



<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->






<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMlZ1WlhKaGRHVmZZV3hzWDNCc2IzUnpJRHd0SUdaMWJtTjBhVzl1S0dSaGRHRXBJSHRjYmlBZ0l5QkRjbVZoY2lCc2FYTjBZU0J3WVhKaElHRnNiV0ZqWlc1aGNpQndiRzkwYzF4dUlDQndiRzkwY3lBOExTQnNhWE4wS0NsY2JpQWdYRzRnSUdOaGRDaGNJa2RsYm1WeVlXNWtieUIyYVhOMVlXeHBlbUZqYVc5dVpYTWdiWFZzZEdsMllYSnBZV0pzWlhNdUxpNWNYRzVjWEc1Y0lpbGNiaUFnWEc0Z0lHTmhkQ2hjSWpFdUlFMWhkSEpwZWlCa1pTQkRiM0p5Wld4aFkybkRzMjRnWTI5dUlFTnNkWE4wWlhKcGJtY3VMaTVjWEc1Y0lpbGNiaUFnY0d4dmRGOWpiM0p5Wld4aGRHbHZibDl0WVhSeWFYZ29aR0YwWVNsY2JpQWdYRzRnSUdOaGRDaGNJakl1SUZCaGFYSndiRzkwSUdSbElGWmhjbWxoWW14bGN5QlNaVzVoYkdWekxpNHVYRnh1WENJcFhHNGdJSEJzYjNSekpISmxibUZzWDNCaGFYSnpJRHd0SUhCc2IzUmZjbVZ1WVd4ZmNHRnBjbk1vWkdGMFlTbGNiaUFnY0hKcGJuUW9jR3h2ZEhNa2NtVnVZV3hmY0dGcGNuTXBYRzRnSUZ4dUlDQmpZWFFvWENJekxpQlRZMkYwZEdWeWNHeHZkQ0EwUkNBb1IwWlNMVU55WldGMGFXNXBibUV0UldSaFpDMUNUVWtwTGk0dVhGeHVYQ0lwWEc0Z0lIQnNiM1J6SkdkbWNsOHpaQ0E4TFNCd2JHOTBYMmRtY2w4elpDaGtZWFJoS1Z4dUlDQndjbWx1ZENod2JHOTBjeVJuWm5KZk0yUXBYRzRnSUZ4dUlDQmpZWFFvWENJMExpQklaV0YwYldGd0lHUmxJRkJsY21acGJHVnpJRU5zdzYxdWFXTnZjeTR1TGx4Y2Jsd2lLVnh1SUNCd2JHOTBjeVJvWldGMGJXRndJRHd0SUhCc2IzUmZZMnhwYm1sallXeGZhR1ZoZEcxaGNDaGtZWFJoS1Z4dUlDQndjbWx1ZENod2JHOTBjeVJvWldGMGJXRndLVnh1SUNCY2JpQWdZMkYwS0Z3aU5TNGdVR0Z5WVd4c1pXd2dRMjl2Y21ScGJtRjBaWE1nS0VaaFkzUnZjbVZ6SUdSbElGSnBaWE5uYnlrdUxpNWNYRzVjSWlsY2JpQWdjR3h2ZEhNa2NHRnlZV3hzWld3Z1BDMGdjR3h2ZEY5d1lYSmhiR3hsYkY5amIyOXlaR2x1WVhSbGN5aGtZWFJoS1Z4dUlDQndjbWx1ZENod2JHOTBjeVJ3WVhKaGJHeGxiQ2xjYmlBZ1hHNGdJR05oZENoY0lqWXVJRUp2ZUhCc2IzUnpJRVJsYlc5bmNzT2habWxqYjNNZ1JtRmpaWFJoWkc5ekxpNHVYRnh1WENJcFhHNGdJSEJzYjNSekpHUmxiVzlmWW05NElEd3RJSEJzYjNSZlpHVnRiMmR5WVhCb2FXTmZZbTk0Y0d4dmRITW9aR0YwWVNsY2JpQWdjSEpwYm5Rb2NHeHZkSE1rWkdWdGIxOWliM2dwWEc0Z0lGeHVJQ0JqWVhRb1hDSTNMaUJDZFdKaWJHVWdRMmhoY25RZ0tFTmhiR2xrWVdRZ1pHVWdWbWxrWVNrdUxpNWNYRzVjSWlsY2JpQWdjR3h2ZEhNa1luVmlZbXhsSUR3dElIQnNiM1JmY1c5c1gySjFZbUpzWlNoa1lYUmhLVnh1SUNCd2NtbHVkQ2h3Ykc5MGN5UmlkV0ppYkdVcFhHNGdJRnh1SUNCallYUW9YQ0k0TGlCV2FXOXNhVzRnVUd4dmRITWdLRTFsWkdsallXMWxiblJ2Y3lrdUxpNWNYRzVjSWlsY2JpQWdjR3h2ZEhNa2RtbHZiR2x1Y3lBOExTQndiRzkwWDIxbFpHbGpZWFJwYjI1ZmRtbHZiR2x1Y3loa1lYUmhLVnh1SUNCd2NtbHVkQ2h3Ykc5MGN5UjJhVzlzYVc1ektWeHVJQ0JjYmlBZ1kyRjBLRndpT1M0Z1EyOXVkRzkxY2lCUWJHOTBJQ2hFWlc1emFXUmhaQ0JIUmxJdFNHSkJNV01wTGk0dVhGeHVYQ0lwWEc0Z0lIQnNiM1J6SkdOdmJuUnZkWElnUEMwZ2NHeHZkRjlrWlc1emFYUjVYMk52Ym5SdmRYSW9aR0YwWVNsY2JpQWdjSEpwYm5Rb2NHeHZkSE1rWTI5dWRHOTFjaWxjYmlBZ1hHNGdJR05oZENoY0lqRXdMaUJTYVdSblpTQlFiRzkwSUNoRlpHRmtJSEJ2Y2lCRGIyMXZjbUpwYkdsa1lXUmxjeWt1TGk1Y1hHNWNJaWxjYmlBZ2NHeHZkSE1rY21sa1oyVnpJRHd0SUhCc2IzUmZZV2RsWDNKcFpHZGxjeWhrWVhSaEtWeHVJQ0J3Y21sdWRDaHdiRzkwY3lSeWFXUm5aWE1wWEc0Z0lGeHVJQ0JqWVhRb1hDSmNYRzdDb1ZSdlpHRnpJR3hoY3lCMmFYTjFZV3hwZW1GamFXOXVaWE1nWjJWdVpYSmhaR0Z6SUdWNGFYUnZjMkZ0Wlc1MFpTRmNYRzVjSWlsY2JpQWdYRzRnSUhKbGRIVnliaWhwYm5acGMybGliR1VvY0d4dmRITXBLVnh1ZlZ4dVhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuZ2VuZXJhdGVfYWxsX3Bsb3RzIDwtIGZ1bmN0aW9uKGRhdGEpIHtcbiAgIyBDcmVhciBsaXN0YSBwYXJhIGFsbWFjZW5hciBwbG90c1xuICBwbG90cyA8LSBsaXN0KClcbiAgXG4gIGNhdChcIkdlbmVyYW5kbyB2aXN1YWxpemFjaW9uZXMgbXVsdGl2YXJpYWJsZXMuLi5cXG5cXG5cIilcbiAgXG4gIGNhdChcIjEuIE1hdHJpeiBkZSBDb3JyZWxhY2nDs24gY29uIENsdXN0ZXJpbmcuLi5cXG5cIilcbiAgcGxvdF9jb3JyZWxhdGlvbl9tYXRyaXgoZGF0YSlcbiAgXG4gIGNhdChcIjIuIFBhaXJwbG90IGRlIFZhcmlhYmxlcyBSZW5hbGVzLi4uXFxuXCIpXG4gIHBsb3RzJHJlbmFsX3BhaXJzIDwtIHBsb3RfcmVuYWxfcGFpcnMoZGF0YSlcbiAgcHJpbnQocGxvdHMkcmVuYWxfcGFpcnMpXG4gIFxuICBjYXQoXCIzLiBTY2F0dGVycGxvdCA0RCAoR0ZSLUNyZWF0aW5pbmEtRWRhZC1CTUkpLi4uXFxuXCIpXG4gIHBsb3RzJGdmcl8zZCA8LSBwbG90X2dmcl8zZChkYXRhKVxuICBwcmludChwbG90cyRnZnJfM2QpXG4gIFxuICBjYXQoXCI0LiBIZWF0bWFwIGRlIFBlcmZpbGVzIENsw61uaWNvcy4uLlxcblwiKVxuICBwbG90cyRoZWF0bWFwIDwtIHBsb3RfY2xpbmljYWxfaGVhdG1hcChkYXRhKVxuICBwcmludChwbG90cyRoZWF0bWFwKVxuICBcbiAgY2F0KFwiNS4gUGFyYWxsZWwgQ29vcmRpbmF0ZXMgKEZhY3RvcmVzIGRlIFJpZXNnbykuLi5cXG5cIilcbiAgcGxvdHMkcGFyYWxsZWwgPC0gcGxvdF9wYXJhbGxlbF9jb29yZGluYXRlcyhkYXRhKVxuICBwcmludChwbG90cyRwYXJhbGxlbClcbiAgXG4gIGNhdChcIjYuIEJveHBsb3RzIERlbW9ncsOhZmljb3MgRmFjZXRhZG9zLi4uXFxuXCIpXG4gIHBsb3RzJGRlbW9fYm94IDwtIHBsb3RfZGVtb2dyYXBoaWNfYm94cGxvdHMoZGF0YSlcbiAgcHJpbnQocGxvdHMkZGVtb19ib3gpXG4gIFxuICBjYXQoXCI3LiBCdWJibGUgQ2hhcnQgKENhbGlkYWQgZGUgVmlkYSkuLi5cXG5cIilcbiAgcGxvdHMkYnViYmxlIDwtIHBsb3RfcW9sX2J1YmJsZShkYXRhKVxuICBwcmludChwbG90cyRidWJibGUpXG4gIFxuICBjYXQoXCI4LiBWaW9saW4gUGxvdHMgKE1lZGljYW1lbnRvcykuLi5cXG5cIilcbiAgcGxvdHMkdmlvbGlucyA8LSBwbG90X21lZGljYXRpb25fdmlvbGlucyhkYXRhKVxuICBwcmludChwbG90cyR2aW9saW5zKVxuICBcbiAgY2F0KFwiOS4gQ29udG91ciBQbG90IChEZW5zaWRhZCBHRlItSGJBMWMpLi4uXFxuXCIpXG4gIHBsb3RzJGNvbnRvdXIgPC0gcGxvdF9kZW5zaXR5X2NvbnRvdXIoZGF0YSlcbiAgcHJpbnQocGxvdHMkY29udG91cilcbiAgXG4gIGNhdChcIjEwLiBSaWRnZSBQbG90IChFZGFkIHBvciBDb21vcmJpbGlkYWRlcykuLi5cXG5cIilcbiAgcGxvdHMkcmlkZ2VzIDwtIHBsb3RfYWdlX3JpZGdlcyhkYXRhKVxuICBwcmludChwbG90cyRyaWRnZXMpXG4gIFxuICBjYXQoXCJcXG7CoVRvZGFzIGxhcyB2aXN1YWxpemFjaW9uZXMgZ2VuZXJhZGFzIGV4aXRvc2FtZW50ZSFcXG5cIilcbiAgXG4gIHJldHVybihpbnZpc2libGUocGxvdHMpKVxufVxuXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZ2VuZXJhdGVfYWxsX3Bsb3RzIDwtIGZ1bmN0aW9uKGRhdGEpIHtcbiAgIyBDcmVhciBsaXN0YSBwYXJhIGFsbWFjZW5hciBwbG90c1xuICBwbG90cyA8LSBsaXN0KClcbiAgXG4gIGNhdChcIkdlbmVyYW5kbyB2aXN1YWxpemFjaW9uZXMgbXVsdGl2YXJpYWJsZXMuLi5cXG5cXG5cIilcbiAgXG4gIGNhdChcIjEuIE1hdHJpeiBkZSBDb3JyZWxhY2nDs24gY29uIENsdXN0ZXJpbmcuLi5cXG5cIilcbiAgcGxvdF9jb3JyZWxhdGlvbl9tYXRyaXgoZGF0YSlcbiAgXG4gIGNhdChcIjIuIFBhaXJwbG90IGRlIFZhcmlhYmxlcyBSZW5hbGVzLi4uXFxuXCIpXG4gIHBsb3RzJHJlbmFsX3BhaXJzIDwtIHBsb3RfcmVuYWxfcGFpcnMoZGF0YSlcbiAgcHJpbnQocGxvdHMkcmVuYWxfcGFpcnMpXG4gIFxuICBjYXQoXCIzLiBTY2F0dGVycGxvdCA0RCAoR0ZSLUNyZWF0aW5pbmEtRWRhZC1CTUkpLi4uXFxuXCIpXG4gIHBsb3RzJGdmcl8zZCA8LSBwbG90X2dmcl8zZChkYXRhKVxuICBwcmludChwbG90cyRnZnJfM2QpXG4gIFxuICBjYXQoXCI0LiBIZWF0bWFwIGRlIFBlcmZpbGVzIENsw61uaWNvcy4uLlxcblwiKVxuICBwbG90cyRoZWF0bWFwIDwtIHBsb3RfY2xpbmljYWxfaGVhdG1hcChkYXRhKVxuICBwcmludChwbG90cyRoZWF0bWFwKVxuICBcbiAgY2F0KFwiNS4gUGFyYWxsZWwgQ29vcmRpbmF0ZXMgKEZhY3RvcmVzIGRlIFJpZXNnbykuLi5cXG5cIilcbiAgcGxvdHMkcGFyYWxsZWwgPC0gcGxvdF9wYXJhbGxlbF9jb29yZGluYXRlcyhkYXRhKVxuICBwcmludChwbG90cyRwYXJhbGxlbClcbiAgXG4gIGNhdChcIjYuIEJveHBsb3RzIERlbW9ncsOhZmljb3MgRmFjZXRhZG9zLi4uXFxuXCIpXG4gIHBsb3RzJGRlbW9fYm94IDwtIHBsb3RfZGVtb2dyYXBoaWNfYm94cGxvdHMoZGF0YSlcbiAgcHJpbnQocGxvdHMkZGVtb19ib3gpXG4gIFxuICBjYXQoXCI3LiBCdWJibGUgQ2hhcnQgKENhbGlkYWQgZGUgVmlkYSkuLi5cXG5cIilcbiAgcGxvdHMkYnViYmxlIDwtIHBsb3RfcW9sX2J1YmJsZShkYXRhKVxuICBwcmludChwbG90cyRidWJibGUpXG4gIFxuICBjYXQoXCI4LiBWaW9saW4gUGxvdHMgKE1lZGljYW1lbnRvcykuLi5cXG5cIilcbiAgcGxvdHMkdmlvbGlucyA8LSBwbG90X21lZGljYXRpb25fdmlvbGlucyhkYXRhKVxuICBwcmludChwbG90cyR2aW9saW5zKVxuICBcbiAgY2F0KFwiOS4gQ29udG91ciBQbG90IChEZW5zaWRhZCBHRlItSGJBMWMpLi4uXFxuXCIpXG4gIHBsb3RzJGNvbnRvdXIgPC0gcGxvdF9kZW5zaXR5X2NvbnRvdXIoZGF0YSlcbiAgcHJpbnQocGxvdHMkY29udG91cilcbiAgXG4gIGNhdChcIjEwLiBSaWRnZSBQbG90IChFZGFkIHBvciBDb21vcmJpbGlkYWRlcykuLi5cXG5cIilcbiAgcGxvdHMkcmlkZ2VzIDwtIHBsb3RfYWdlX3JpZGdlcyhkYXRhKVxuICBwcmludChwbG90cyRyaWRnZXMpXG4gIFxuICBjYXQoXCJcXG7CoVRvZGFzIGxhcyB2aXN1YWxpemFjaW9uZXMgZ2VuZXJhZGFzIGV4aXRvc2FtZW50ZSFcXG5cIilcbiAgXG4gIHJldHVybihpbnZpc2libGUocGxvdHMpKVxufVxuXG5gYGAifQ== -->

```r
generate_all_plots <- function(data) {
  # Crear lista para almacenar plots
  plots <- list()
  
  cat("Generando visualizaciones multivariables...\n\n")
  
  cat("1. Matriz de Correlación con Clustering...\n")
  plot_correlation_matrix(data)
  
  cat("2. Pairplot de Variables Renales...\n")
  plots$renal_pairs <- plot_renal_pairs(data)
  print(plots$renal_pairs)
  
  cat("3. Scatterplot 4D (GFR-Creatinina-Edad-BMI)...\n")
  plots$gfr_3d <- plot_gfr_3d(data)
  print(plots$gfr_3d)
  
  cat("4. Heatmap de Perfiles Clínicos...\n")
  plots$heatmap <- plot_clinical_heatmap(data)
  print(plots$heatmap)
  
  cat("5. Parallel Coordinates (Factores de Riesgo)...\n")
  plots$parallel <- plot_parallel_coordinates(data)
  print(plots$parallel)
  
  cat("6. Boxplots Demográficos Facetados...\n")
  plots$demo_box <- plot_demographic_boxplots(data)
  print(plots$demo_box)
  
  cat("7. Bubble Chart (Calidad de Vida)...\n")
  plots$bubble <- plot_qol_bubble(data)
  print(plots$bubble)
  
  cat("8. Violin Plots (Medicamentos)...\n")
  plots$violins <- plot_medication_violins(data)
  print(plots$violins)
  
  cat("9. Contour Plot (Densidad GFR-HbA1c)...\n")
  plots$contour <- plot_density_contour(data)
  print(plots$contour)
  
  cat("10. Ridge Plot (Edad por Comorbilidades)...\n")
  plots$ridges <- plot_age_ridges(data)
  print(plots$ridges)
  
  cat("\n¡Todas las visualizaciones generadas exitosamente!\n")
  
  return(invisible(plots))
}
plots <- generate_all_plots(ckd_data)
Generando visualizaciones multivariables...

1. Matriz de Correlación con Clustering...
2. Pairplot de Variables Renales...
3. Scatterplot 4D (GFR-Creatinina-Edad-BMI)...
4. Heatmap de Perfiles Clínicos...
5. Parallel Coordinates (Factores de Riesgo)...
6. Boxplots Demográficos Facetados...
7. Bubble Chart (Calidad de Vida)...
8. Violin Plots (Medicamentos)...
9. Contour Plot (Densidad GFR-HbA1c)...
10. Ridge Plot (Edad por Comorbilidades)...

¡Todas las visualizaciones generadas exitosamente!

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KEdHYWxseSkKbGlicmFyeShjb3JycGxvdCkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KHJlc2hhcGUyKQoKIyBDb25maWd1cmFjacOzbiBnZW5lcmFsCnRoZW1lX3NldCh0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDExKSkKCiMgTk9UQTogUmVlbXBsYXphciAnY2tkX2RhdGEnIGNvbiBlbCBub21icmUgcmVhbCBkZSB0dSBkYXRhZnJhbWUKZ2V0d2QoKSAgCnNldHdkKCIvVXNlcnMvc2FtaXJjYWJyZXJhL0RldmVsb3BtZW50L1VuaXZlcnNpZGFkL0ludGVsaWdlbmNpYSBBcnRpZmljaWFsL0ludGVsaWdlbmNpYS1BcnRpZmljaWFsIikgIApja2RfZGF0YSA8LSByZWFkLmNzdigiL1VzZXJzL3NhbWlyY2FicmVyYS9EZXZlbG9wbWVudC9Vbml2ZXJzaWRhZC9JbnRlbGlnZW5jaWEgQXJ0aWZpY2lhbC9JbnRlbGlnZW5jaWEtQXJ0aWZpY2lhbC9Qcm95ZWN0by9EYXRhc2V0L0Nocm9uaWNfS2lkbmV5X0RzZWFzZV9kYXRhLmNzdiIpCmhlYWQoZGF0b3MpCmBgYApgYGB7cn0KcGxvdF9jb3JyZWxhdGlvbl9tYXRyaXggPC0gZnVuY3Rpb24oZGF0YSkgewogICMgU2VsZWNjaW9uYXIgc29sbyB2YXJpYWJsZXMgbnVtw6lyaWNhcyByZWxldmFudGVzCiAgbnVtZXJpY192YXJzIDwtIGRhdGEgJT4lIAogICAgc2VsZWN0KEFnZSwgQk1JLCBTeXN0b2xpY0JQLCBEaWFzdG9saWNCUCwgRmFzdGluZ0Jsb29kU3VnYXIsIEhiQTFjLAogICAgICAgICAgIFNlcnVtQ3JlYXRpbmluZSwgQlVOTGV2ZWxzLCBHRlIsIFByb3RlaW5JblVyaW5lLCBBQ1IsCiAgICAgICAgICAgSGVtb2dsb2JpbkxldmVscywgQ2hvbGVzdGVyb2xUb3RhbCwgQ2hvbGVzdGVyb2xMREwsCiAgICAgICAgICAgRmF0aWd1ZUxldmVscywgUXVhbGl0eU9mTGlmZVNjb3JlLCBNZWRpY2F0aW9uQWRoZXJlbmNlKQogIAogIGNvcl9tYXRyaXggPC0gY29yKG51bWVyaWNfdmFycywgdXNlID0gImNvbXBsZXRlLm9icyIpCiAgCiAgY29ycnBsb3QoY29yX21hdHJpeCwgCiAgICAgICAgICAgbWV0aG9kID0gImNvbG9yIiwKICAgICAgICAgICB0eXBlID0gInVwcGVyIiwKICAgICAgICAgICBvcmRlciA9ICJoY2x1c3QiLCAgIyBBZ3J1cGFjacOzbiBqZXLDoXJxdWljYQogICAgICAgICAgIGFkZHJlY3QgPSA0LCAgICAgICAjIE1hcmNhIDQgY2x1c3RlcnMgcHJpbmNpcGFsZXMKICAgICAgICAgICB0bC5jb2wgPSAiYmxhY2siLAogICAgICAgICAgIHRsLnNydCA9IDQ1LAogICAgICAgICAgIHRsLmNleCA9IDAuOCwKICAgICAgICAgICBjb2wgPSBjb2xvclJhbXBQYWxldHRlKGMoIiM2RDlFQzEiLCAid2hpdGUiLCAiI0U0NjcyNiIpKSgyMDApLAogICAgICAgICAgIHRpdGxlID0gIk1hdHJpeiBkZSBDb3JyZWxhY2nDs24gY29uIENsdXN0ZXJpbmcgSmVyw6FycXVpY28iLAogICAgICAgICAgIG1hciA9IGMoMCwwLDIsMCkpCn0KYGBgCgoKYGBge3J9CnBsb3RfcmVuYWxfcGFpcnMgPC0gZnVuY3Rpb24oZGF0YSkgewogIHJlbmFsX2RhdGEgPC0gZGF0YSAlPiUKICAgIHNlbGVjdChHRlIsIFNlcnVtQ3JlYXRpbmluZSwgQlVOTGV2ZWxzLCBQcm90ZWluSW5VcmluZSwgQUNSLCBEaWFnbm9zaXMpICU+JQogICAgbXV0YXRlKERpYWdub3NpcyA9IGZhY3RvcihEaWFnbm9zaXMsIGxhYmVscyA9IGMoIk5vIENLRCIsICJDS0QiKSkpCiAgCiAgZ2dwYWlycyhyZW5hbF9kYXRhLAogICAgICAgICAgY29sdW1ucyA9IDE6NSwKICAgICAgICAgIGFlcyhjb2xvciA9IERpYWdub3NpcywgYWxwaGEgPSAwLjUpLAogICAgICAgICAgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMykpLAogICAgICAgICAgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJwb2ludHMiLCBhbHBoYSA9IDAuMywgc2l6ZSA9IDAuNSkpLAogICAgICAgICAgZGlhZyA9IGxpc3QoY29udGludW91cyA9IHdyYXAoImRlbnNpdHlEaWFnIiwgYWxwaGEgPSAwLjUpKSwKICAgICAgICAgIHRpdGxlID0gIlJlbGFjaW9uZXMgZW50cmUgTWFyY2Fkb3JlcyBSZW5hbGVzIChwb3IgRGlhZ25vc2lzKSIpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpKQp9CmBgYAoKYGBge3J9CnBsb3RfZ2ZyXzNkIDwtIGZ1bmN0aW9uKGRhdGEpIHsKICBkYXRhX3Bsb3QgPC0gZGF0YSAlPiUKICAgIG11dGF0ZShEaWFnbm9zaXMgPSBmYWN0b3IoRGlhZ25vc2lzLCBsYWJlbHMgPSBjKCJObyBDS0QiLCAiQ0tEIikpKQogIAogIGdncGxvdChkYXRhX3Bsb3QsIGFlcyh4ID0gU2VydW1DcmVhdGluaW5lLCB5ID0gR0ZSKSkgKwogICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBBZ2UsIHNpemUgPSBCTUksIHNoYXBlID0gRGlhZ25vc2lzKSwgYWxwaGEgPSAwLjYpICsKICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNikpICsKICAgIGdlb21fc21vb3RoKGFlcyhsaW5ldHlwZSA9IERpYWdub3NpcyksIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gVFJVRSwgCiAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjgpICsKICAgIGxhYnModGl0bGUgPSAiR0ZSIHZzIENyZWF0aW5pbmEgKEVkYWQgZW4gY29sb3IsIEJNSSBlbiB0YW1hw7FvKSIsCiAgICAgICAgIHggPSAiQ3JlYXRpbmluYSBTw6lyaWNhIChtZy9kTCkiLAogICAgICAgICB5ID0gIkdGUiAobUwvbWluLzEuNzNtwrIpIiwKICAgICAgICAgY2FwdGlvbiA9ICJMYXMgbMOtbmVhcyBtdWVzdHJhbiB0ZW5kZW5jaWFzIHBvciBncnVwbyBkZSBkaWFnbsOzc3RpY28iKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCn0KYGBgCgpgYGB7cn0KcGxvdF9jbGluaWNhbF9oZWF0bWFwIDwtIGZ1bmN0aW9uKGRhdGEpIHsKICAjIENyZWFyIGVzdGFkaW9zIGRlIENLRCBiYXNhZG9zIGVuIEdGUgogIGRhdGFfc3RhZ2VkIDwtIGRhdGEgJT4lCiAgICBtdXRhdGUoQ0tEX1N0YWdlID0gY2FzZV93aGVuKAogICAgICBHRlIgPj0gOTAgfiAiTm9ybWFsICjiiaU5MCkiLAogICAgICBHRlIgPj0gNjAgfiAiTWlsZCAoNjAtODkpIiwKICAgICAgR0ZSID49IDMwIH4gIk1vZGVyYXRlICgzMC01OSkiLAogICAgICBHRlIgPj0gMTUgfiAiU2V2ZXJlICgxNS0yOSkiLAogICAgICBUUlVFIH4gIktpZG5leSBGYWlsdXJlICg8MTUpIgogICAgKSkgJT4lCiAgICBtdXRhdGUoQ0tEX1N0YWdlID0gZmFjdG9yKENLRF9TdGFnZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk5vcm1hbCAo4omlOTApIiwgIk1pbGQgKDYwLTg5KSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb2RlcmF0ZSAoMzAtNTkpIiwgIlNldmVyZSAoMTUtMjkpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktpZG5leSBGYWlsdXJlICg8MTUpIikpKQogIAogICMgQ2FsY3VsYXIgcHJvbWVkaW9zIHBvciBlc3RhZGlvCiAgaGVhdG1hcF9kYXRhIDwtIGRhdGFfc3RhZ2VkICU+JQogICAgZ3JvdXBfYnkoQ0tEX1N0YWdlKSAlPiUKICAgIHN1bW1hcmlzZSgKICAgICAgQk1JID0gbWVhbihCTUksIG5hLnJtID0gVFJVRSksCiAgICAgIFN5c3RvbGljQlAgPSBtZWFuKFN5c3RvbGljQlAsIG5hLnJtID0gVFJVRSksCiAgICAgIEhiQTFjID0gbWVhbihIYkExYywgbmEucm0gPSBUUlVFKSwKICAgICAgQ3JlYXRpbmluZSA9IG1lYW4oU2VydW1DcmVhdGluaW5lLCBuYS5ybSA9IFRSVUUpLAogICAgICBIZW1vZ2xvYmluID0gbWVhbihIZW1vZ2xvYmluTGV2ZWxzLCBuYS5ybSA9IFRSVUUpLAogICAgICBQcm90ZWluVXJpbmUgPSBtZWFuKFByb3RlaW5JblVyaW5lLCBuYS5ybSA9IFRSVUUpLAogICAgICBGYXRpZ3VlID0gbWVhbihGYXRpZ3VlTGV2ZWxzLCBuYS5ybSA9IFRSVUUpLAogICAgICBRb0wgPSBtZWFuKFF1YWxpdHlPZkxpZmVTY29yZSwgbmEucm0gPSBUUlVFKQogICAgKSAlPiUKICAgIHBpdm90X2xvbmdlcigtQ0tEX1N0YWdlLCBuYW1lc190byA9ICJWYXJpYWJsZSIsIHZhbHVlc190byA9ICJWYWx1ZSIpICU+JQogICAgZ3JvdXBfYnkoVmFyaWFibGUpICU+JQogICAgbXV0YXRlKFZhbHVlX3NjYWxlZCA9IHNjYWxlKFZhbHVlKVssMV0pICAjIEVzdGFuZGFyaXphciBwb3IgdmFyaWFibGUKICAKICBnZ3Bsb3QoaGVhdG1hcF9kYXRhLCBhZXMoeCA9IENLRF9TdGFnZSwgeSA9IFZhcmlhYmxlLCBmaWxsID0gVmFsdWVfc2NhbGVkKSkgKwogICAgZ2VvbV90aWxlKGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDAuNSkgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKFZhbHVlLCAxKSksIHNpemUgPSAzLCBjb2xvciA9ICJ3aGl0ZSIpICsKICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdyA9ICIjM0I5QUIyIiwgbWlkID0gIiNFQkNDMkEiLCBoaWdoID0gIiNGMjFBMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgbWlkcG9pbnQgPSAwLCBuYW1lID0gIlotc2NvcmUiKSArCiAgICBsYWJzKHRpdGxlID0gIlBlcmZpbCBDbMOtbmljbyBQcm9tZWRpbyBwb3IgRXN0YWRpbyBkZSBDS0QiLAogICAgICAgICB4ID0gIkVzdGFkaW8gZGUgRW5mZXJtZWRhZCBSZW5hbCIsCiAgICAgICAgIHkgPSAiVmFyaWFibGUgQ2zDrW5pY2EiLAogICAgICAgICBjYXB0aW9uID0gIlZhbG9yZXMgZXN0YW5kYXJpemFkb3MgKFotc2NvcmVzKSAtIG7Dum1lcm9zID0gdmFsb3IgcmVhbCBwcm9tZWRpbyIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiKSkKfQpgYGAKCmBgYHtyfQpwbG90X3BhcmFsbGVsX2Nvb3JkaW5hdGVzIDwtIGZ1bmN0aW9uKGRhdGEpIHsKICBwYXJhbGxlbF9kYXRhIDwtIGRhdGEgJT4lCiAgICBzZWxlY3QoUGF0aWVudElELCBCTUksIFBoeXNpY2FsQWN0aXZpdHksIERpZXRRdWFsaXR5LCBTbGVlcFF1YWxpdHksCiAgICAgICAgICAgQWxjb2hvbENvbnN1bXB0aW9uLCBTbW9raW5nLCBEaWFnbm9zaXMpICU+JQogICAgbXV0YXRlKERpYWdub3NpcyA9IGZhY3RvcihEaWFnbm9zaXMsIGxhYmVscyA9IGMoIk5vIENLRCIsICJDS0QiKSkpICU+JQogICAgIyBFc3RhbmRhcml6YXIgdmFyaWFibGVzIHBhcmEgZXNjYWxhIGNvbcO6bgogICAgbXV0YXRlKGFjcm9zcyhjKEJNSSwgUGh5c2ljYWxBY3Rpdml0eSwgRGlldFF1YWxpdHksIFNsZWVwUXVhbGl0eSwgCiAgICAgICAgICAgICAgICAgICAgQWxjb2hvbENvbnN1bXB0aW9uKSwgc2NhbGUpKSAlPiUKICAgIHNhbXBsZV9uKDIwMCkgICMgTXVlc3RyYSBwYXJhIGNsYXJpZGFkIHZpc3VhbAogIAogIHBhcmFsbGVsX2xvbmcgPC0gcGFyYWxsZWxfZGF0YSAlPiUKICAgIHBpdm90X2xvbmdlcihjb2xzID0gYyhCTUksIFBoeXNpY2FsQWN0aXZpdHksIERpZXRRdWFsaXR5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBTbGVlcFF1YWxpdHksIEFsY29ob2xDb25zdW1wdGlvbiksCiAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiVmFyaWFibGUiLCB2YWx1ZXNfdG8gPSAiVmFsdWUiKSAlPiUKICAgIG11dGF0ZShWYXJpYWJsZSA9IGZhY3RvcihWYXJpYWJsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiQk1JIiwgIlBoeXNpY2FsQWN0aXZpdHkiLCAiRGlldFF1YWxpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNsZWVwUXVhbGl0eSIsICJBbGNvaG9sQ29uc3VtcHRpb24iKSkpCiAgCiAgZ2dwbG90KHBhcmFsbGVsX2xvbmcsIGFlcyh4ID0gVmFyaWFibGUsIHkgPSBWYWx1ZSwgZ3JvdXAgPSBQYXRpZW50SUQpKSArCiAgICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gRGlhZ25vc2lzKSwgYWxwaGEgPSAwLjMsIHNpemUgPSAwLjUpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gRGlhZ25vc2lzKSwgYWxwaGEgPSAwLjQsIHNpemUgPSAxKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiTm8gQ0tEIiA9ICIjMDBCQTM4IiwgIkNLRCIgPSAiI0Y4NzY2RCIpKSArCiAgICBsYWJzKHRpdGxlID0gIlBlcmZpbGVzIGRlIEVzdGlsbyBkZSBWaWRhIChQYXJhbGxlbCBDb29yZGluYXRlcykiLAogICAgICAgICBzdWJ0aXRsZSA9ICJNdWVzdHJhIGRlIDIwMCBwYWNpZW50ZXMgLSBWYXJpYWJsZXMgZXN0YW5kYXJpemFkYXMiLAogICAgICAgICB5ID0gIlZhbG9yIEVzdGFuZGFyaXphZG8gKFotc2NvcmUpIiwKICAgICAgICAgeCA9ICIiKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKfQpgYGAKCmBgYHtyfQpwbG90X2RlbW9ncmFwaGljX2JveHBsb3RzIDwtIGZ1bmN0aW9uKGRhdGEpIHsKICBkYXRhX2RlbW8gPC0gZGF0YSAlPiUKICAgIG11dGF0ZSgKICAgICAgR2VuZGVyID0gZmFjdG9yKEdlbmRlciwgbGFiZWxzID0gYygiTWFsZSIsICJGZW1hbGUiKSksCiAgICAgIEV0aG5pY2l0eSA9IGZhY3RvcihFdGhuaWNpdHksIGxhYmVscyA9IGMoIkNhdWNhc2lhbiIsICJBZnJpY2FuIEFtZXJpY2FuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzaWFuIiwgIk90aGVyIikpLAogICAgICBTb2Npb2Vjb25vbWljU3RhdHVzID0gZmFjdG9yKFNvY2lvZWNvbm9taWNTdGF0dXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkxvdyIsICJNaWRkbGUiLCAiSGlnaCIpKQogICAgKSAlPiUKICAgIHNlbGVjdChHZW5kZXIsIEV0aG5pY2l0eSwgU29jaW9lY29ub21pY1N0YXR1cywgR0ZSLCBIYkExYywgCiAgICAgICAgICAgU3lzdG9saWNCUCwgUXVhbGl0eU9mTGlmZVNjb3JlKSAlPiUKICAgIHBpdm90X2xvbmdlcihjb2xzID0gYyhHRlIsIEhiQTFjLCBTeXN0b2xpY0JQLCBRdWFsaXR5T2ZMaWZlU2NvcmUpLAogICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkJpb21hcmtlciIsIHZhbHVlc190byA9ICJWYWx1ZSIpCiAgCiAgZ2dwbG90KGRhdGFfZGVtbywgYWVzKHggPSBTb2Npb2Vjb25vbWljU3RhdHVzLCB5ID0gVmFsdWUsIGZpbGwgPSBHZW5kZXIpKSArCiAgICBnZW9tX2JveHBsb3QoYWxwaGEgPSAwLjcsIG91dGxpZXIuc2l6ZSA9IDAuNSkgKwogICAgZmFjZXRfZ3JpZChCaW9tYXJrZXIgfiBFdGhuaWNpdHksIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArCiAgICBsYWJzKHRpdGxlID0gIkJpb21hcmNhZG9yZXMgcG9yIERlbW9ncmFmw61hIChHw6luZXJvLCBFdG5pY2lkYWQsIEVzdGF0dXMgU29jaW9lY29uw7NtaWNvKSIsCiAgICAgICAgIHggPSAiRXN0YXR1cyBTb2Npb2Vjb27Ds21pY28iLAogICAgICAgICB5ID0gIlZhbG9yIGRlbCBCaW9tYXJjYWRvciIpICsKICAgIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDgpLAogICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMSkpCn0KYGBgCgpgYGB7cn0KcGxvdF9xb2xfYnViYmxlIDwtIGZ1bmN0aW9uKGRhdGEpIHsKICBidWJibGVfZGF0YSA8LSBkYXRhICU+JQogICAgbXV0YXRlKAogICAgICBTZXZlcml0eV9TY29yZSA9IChTZXJ1bUNyZWF0aW5pbmUgLSBtaW4oU2VydW1DcmVhdGluaW5lKSkgLyAKICAgICAgICAobWF4KFNlcnVtQ3JlYXRpbmluZSkgLSBtaW4oU2VydW1DcmVhdGluaW5lKSkgKiAxMCwKICAgICAgRGlhZ25vc2lzID0gZmFjdG9yKERpYWdub3NpcywgbGFiZWxzID0gYygiTm8gQ0tEIiwgIkNLRCIpKQogICAgKQogIAogIGdncGxvdChidWJibGVfZGF0YSwgYWVzKHggPSBGYXRpZ3VlTGV2ZWxzLCB5ID0gUXVhbGl0eU9mTGlmZVNjb3JlKSkgKwogICAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IFNldmVyaXR5X1Njb3JlLCBjb2xvciA9IEdGUiwgc2hhcGUgPSBEaWFnbm9zaXMpLCAKICAgICAgICAgICAgICAgYWxwaGEgPSAwLjYpICsKICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gIm1hZ21hIiwgZGlyZWN0aW9uID0gLTEsIAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkdGUlxuKG1ML21pbi8xLjczbcKyKSIpICsKICAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgMTApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNldmVyaWRhZFxuKENyZWF0aW5pbmEpIikgKwogICAgZ2VvbV9zbW9vdGgoYWVzKGNvbG9yID0gTlVMTCwgc2l6ZSA9IE5VTEwpLCBtZXRob2QgPSAibG0iLCAKICAgICAgICAgICAgICAgIHNlID0gVFJVRSwgY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgICBsYWJzKHRpdGxlID0gIkNhbGlkYWQgZGUgVmlkYSB2cyBGYXRpZ2EgKHRhbWHDsW8gPSBTZXZlcmlkYWQsIGNvbG9yID0gR0ZSKSIsCiAgICAgICAgIHggPSAiTml2ZWwgZGUgRmF0aWdhICgwLTEwKSIsCiAgICAgICAgIHkgPSAiU2NvcmUgZGUgQ2FsaWRhZCBkZSBWaWRhICgwLTEwMCkiKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCn0KYGBgCgpgYGB7cn0KcGxvdF9tZWRpY2F0aW9uX3Zpb2xpbnMgPC0gZnVuY3Rpb24oZGF0YSkgewogIG1lZF9kYXRhIDwtIGRhdGEgJT4lCiAgICBtdXRhdGUoCiAgICAgIFRyZWF0bWVudF9JbnRlbnNpdHkgPSBBQ0VJbmhpYml0b3JzICsgRGl1cmV0aWNzICsgU3RhdGlucyArIAogICAgICAgIEFudGlkaWFiZXRpY01lZGljYXRpb25zLAogICAgICBUcmVhdG1lbnRfR3JvdXAgPSBjYXNlX3doZW4oCiAgICAgICAgVHJlYXRtZW50X0ludGVuc2l0eSA9PSAwIH4gIk5vIE1lZHMiLAogICAgICAgIFRyZWF0bWVudF9JbnRlbnNpdHkgPD0gMiB+ICJMb3cgKDEtMikiLAogICAgICAgIFRSVUUgfiAiSGlnaCAoMy00KSIKICAgICAgKSwKICAgICAgVHJlYXRtZW50X0dyb3VwID0gZmFjdG9yKFRyZWF0bWVudF9Hcm91cCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyBNZWRzIiwgIkxvdyAoMS0yKSIsICJIaWdoICgzLTQpIikpCiAgICApICU+JQogICAgc2VsZWN0KFRyZWF0bWVudF9Hcm91cCwgR0ZSLCBIYkExYywgU3lzdG9saWNCUCwgUXVhbGl0eU9mTGlmZVNjb3JlKSAlPiUKICAgIHBpdm90X2xvbmdlcihjb2xzID0gYyhHRlIsIEhiQTFjLCBTeXN0b2xpY0JQLCBRdWFsaXR5T2ZMaWZlU2NvcmUpLAogICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIk91dGNvbWUiLCB2YWx1ZXNfdG8gPSAiVmFsdWUiKQogIAogIGdncGxvdChtZWRfZGF0YSwgYWVzKHggPSBUcmVhdG1lbnRfR3JvdXAsIHkgPSBWYWx1ZSwgZmlsbCA9IFRyZWF0bWVudF9Hcm91cCkpICsKICAgIGdlb21fdmlvbGluKGFscGhhID0gMC43LCB0cmltID0gRkFMU0UpICsKICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjgsIG91dGxpZXIuc2l6ZSA9IDAuNSkgKwogICAgZmFjZXRfd3JhcCh+IE91dGNvbWUsIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikgKwogICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJZbE9yUmQiKSArCiAgICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgT3V0Y29tZXMgQ2zDrW5pY29zIHBvciBJbnRlbnNpZGFkIGRlIFRyYXRhbWllbnRvIiwKICAgICAgICAgc3VidGl0bGUgPSAiSW50ZW5zaWRhZCA9IHN1bWEgZGUgbWVkaWNhbWVudG9zIGNsYXZlIChBQ0VpLCBEaXVyw6l0aWNvLCBFc3RhdGluYSwgQW50aWRpYWLDqXRpY28pIiwKICAgICAgICAgeCA9ICJHcnVwbyBkZSBUcmF0YW1pZW50byIsCiAgICAgICAgIHkgPSAiVmFsb3IgZGVsIE91dGNvbWUiLAogICAgICAgICBmaWxsID0gIkludGVuc2lkYWQiKSArCiAgICB0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDkpKQp9CmBgYAoKYGBge3J9CnBsb3RfZGVuc2l0eV9jb250b3VyIDwtIGZ1bmN0aW9uKGRhdGEpIHsKICBkYXRhX2NvbnRvdXIgPC0gZGF0YSAlPiUKICAgIG11dGF0ZShEaWFnbm9zaXMgPSBmYWN0b3IoRGlhZ25vc2lzLCBsYWJlbHMgPSBjKCJObyBDS0QiLCAiQ0tEIikpKQogIAogIGdncGxvdChkYXRhX2NvbnRvdXIsIGFlcyh4ID0gSGJBMWMsIHkgPSBHRlIpKSArCiAgICBzdGF0X2RlbnNpdHlfMmQoYWVzKGZpbGwgPSBhZnRlcl9zdGF0KGxldmVsKSksIGdlb20gPSAicG9seWdvbiIsIGFscGhhID0gMC41KSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IERpYWdub3NpcyksIGFscGhhID0gMC4zLCBzaXplID0gMSkgKwogICAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJjaXZpZGlzIiwgbmFtZSA9ICJEZW5zaWRhZCIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJObyBDS0QiID0gIiMwMEJBMzgiLCAiQ0tEIiA9ICIjRjg3NjZEIikpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDYwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJyZWQiLCBzaXplID0gMC44KSArCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSA5LCB5ID0gNjUsIGxhYmVsID0gIkdGUiA9IDYwICh1bWJyYWwgQ0tEKSIsIAogICAgICAgICAgICAgY29sb3IgPSAicmVkIiwgc2l6ZSA9IDMpICsKICAgIGxhYnModGl0bGUgPSAiQ29udG9ybm8gZGUgRGVuc2lkYWQ6IEdGUiB2cyBIYkExYyIsCiAgICAgICAgIHN1YnRpdGxlID0gIklkZW50aWZpY2FjacOzbiBkZSBjbHVzdGVycyBkZSByaWVzZ28gbWV0YWLDs2xpY28tcmVuYWwiLAogICAgICAgICB4ID0gIkhiQTFjICglKSIsCiAgICAgICAgIHkgPSAiR0ZSIChtTC9taW4vMS43M23CsikiKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQp9CmBgYAoKYGBge3J9CnBsb3RfYWdlX3JpZGdlcyA8LSBmdW5jdGlvbihkYXRhKSB7CiAgbGlicmFyeShnZ3JpZGdlcykKICAKICByaWRnZV9kYXRhIDwtIGRhdGEgJT4lCiAgICBtdXRhdGUoCiAgICAgIENvbW9yYmlkaXR5X1Byb2ZpbGUgPSBjYXNlX3doZW4oCiAgICAgICAgRmFtaWx5SGlzdG9yeURpYWJldGVzID09IDEgJiBGYW1pbHlIaXN0b3J5SHlwZXJ0ZW5zaW9uID09IDEgfiAKICAgICAgICAgICJEaWFiZXRlcyArIEhUTiIsCiAgICAgICAgRmFtaWx5SGlzdG9yeURpYWJldGVzID09IDEgfiAiRGlhYmV0ZXMgT25seSIsCiAgICAgICAgRmFtaWx5SGlzdG9yeUh5cGVydGVuc2lvbiA9PSAxIH4gIkhUTiBPbmx5IiwKICAgICAgICBGYW1pbHlIaXN0b3J5S2lkbmV5RGlzZWFzZSA9PSAxIH4gIktpZG5leSBEaXNlYXNlIiwKICAgICAgICBUUlVFIH4gIk5vbmUiCiAgICAgICkKICAgICkgJT4lCiAgICBmaWx0ZXIoQ29tb3JiaWRpdHlfUHJvZmlsZSAhPSAiTm9uZSIpCiAgCiAgZ2dwbG90KHJpZGdlX2RhdGEsIGFlcyh4ID0gQWdlLCB5ID0gQ29tb3JiaWRpdHlfUHJvZmlsZSwgZmlsbCA9IENvbW9yYmlkaXR5X1Byb2ZpbGUpKSArCiAgICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGFscGhhID0gMC43LCBzY2FsZSA9IDEuNSkgKwogICAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gInR1cmJvIikgKwogICAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIGRlIEVkYWQgc2Vnw7puIEhpc3RvcmlhIEZhbWlsaWFyIGRlIENvbW9yYmlsaWRhZGVzIiwKICAgICAgICAgeCA9ICJFZGFkIChhw7FvcykiLAogICAgICAgICB5ID0gIlBlcmZpbCBkZSBDb21vcmJpbGlkYWQgRmFtaWxpYXIiKSArCiAgICB0aGVtZV9yaWRnZXMoKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiKSkKfQpgYGAKYGBge3J9CgoKYGBgCgoKYGBge3J9CgoKYGBgCgpgYGB7cn0KCgpgYGAKCmBgYHtyfQoKCmBgYAoKYGBge3J9CgoKYGBgCgpgYGB7cn0KCgpgYGAKCmBgYHtyfQoKCmBgYAoKYGBge3J9CgoKYGBgCgoKCgpgYGB7cn0KZ2VuZXJhdGVfYWxsX3Bsb3RzIDwtIGZ1bmN0aW9uKGRhdGEpIHsKICAjIENyZWFyIGxpc3RhIHBhcmEgYWxtYWNlbmFyIHBsb3RzCiAgcGxvdHMgPC0gbGlzdCgpCiAgCiAgY2F0KCJHZW5lcmFuZG8gdmlzdWFsaXphY2lvbmVzIG11bHRpdmFyaWFibGVzLi4uXG5cbiIpCiAgCiAgY2F0KCIxLiBNYXRyaXogZGUgQ29ycmVsYWNpw7NuIGNvbiBDbHVzdGVyaW5nLi4uXG4iKQogIHBsb3RfY29ycmVsYXRpb25fbWF0cml4KGRhdGEpCiAgCiAgY2F0KCIyLiBQYWlycGxvdCBkZSBWYXJpYWJsZXMgUmVuYWxlcy4uLlxuIikKICBwbG90cyRyZW5hbF9wYWlycyA8LSBwbG90X3JlbmFsX3BhaXJzKGRhdGEpCiAgcHJpbnQocGxvdHMkcmVuYWxfcGFpcnMpCiAgCiAgY2F0KCIzLiBTY2F0dGVycGxvdCA0RCAoR0ZSLUNyZWF0aW5pbmEtRWRhZC1CTUkpLi4uXG4iKQogIHBsb3RzJGdmcl8zZCA8LSBwbG90X2dmcl8zZChkYXRhKQogIHByaW50KHBsb3RzJGdmcl8zZCkKICAKICBjYXQoIjQuIEhlYXRtYXAgZGUgUGVyZmlsZXMgQ2zDrW5pY29zLi4uXG4iKQogIHBsb3RzJGhlYXRtYXAgPC0gcGxvdF9jbGluaWNhbF9oZWF0bWFwKGRhdGEpCiAgcHJpbnQocGxvdHMkaGVhdG1hcCkKICAKICBjYXQoIjUuIFBhcmFsbGVsIENvb3JkaW5hdGVzIChGYWN0b3JlcyBkZSBSaWVzZ28pLi4uXG4iKQogIHBsb3RzJHBhcmFsbGVsIDwtIHBsb3RfcGFyYWxsZWxfY29vcmRpbmF0ZXMoZGF0YSkKICBwcmludChwbG90cyRwYXJhbGxlbCkKICAKICBjYXQoIjYuIEJveHBsb3RzIERlbW9ncsOhZmljb3MgRmFjZXRhZG9zLi4uXG4iKQogIHBsb3RzJGRlbW9fYm94IDwtIHBsb3RfZGVtb2dyYXBoaWNfYm94cGxvdHMoZGF0YSkKICBwcmludChwbG90cyRkZW1vX2JveCkKICAKICBjYXQoIjcuIEJ1YmJsZSBDaGFydCAoQ2FsaWRhZCBkZSBWaWRhKS4uLlxuIikKICBwbG90cyRidWJibGUgPC0gcGxvdF9xb2xfYnViYmxlKGRhdGEpCiAgcHJpbnQocGxvdHMkYnViYmxlKQogIAogIGNhdCgiOC4gVmlvbGluIFBsb3RzIChNZWRpY2FtZW50b3MpLi4uXG4iKQogIHBsb3RzJHZpb2xpbnMgPC0gcGxvdF9tZWRpY2F0aW9uX3Zpb2xpbnMoZGF0YSkKICBwcmludChwbG90cyR2aW9saW5zKQogIAogIGNhdCgiOS4gQ29udG91ciBQbG90IChEZW5zaWRhZCBHRlItSGJBMWMpLi4uXG4iKQogIHBsb3RzJGNvbnRvdXIgPC0gcGxvdF9kZW5zaXR5X2NvbnRvdXIoZGF0YSkKICBwcmludChwbG90cyRjb250b3VyKQogIAogIGNhdCgiMTAuIFJpZGdlIFBsb3QgKEVkYWQgcG9yIENvbW9yYmlsaWRhZGVzKS4uLlxuIikKICBwbG90cyRyaWRnZXMgPC0gcGxvdF9hZ2VfcmlkZ2VzKGRhdGEpCiAgcHJpbnQocGxvdHMkcmlkZ2VzKQogIAogIGNhdCgiXG7CoVRvZGFzIGxhcyB2aXN1YWxpemFjaW9uZXMgZ2VuZXJhZGFzIGV4aXRvc2FtZW50ZSFcbiIpCiAgCiAgcmV0dXJuKGludmlzaWJsZShwbG90cykpCn0KCmBgYAoKYGBge3J9CnBsb3RzIDwtIGdlbmVyYXRlX2FsbF9wbG90cyhja2RfZGF0YSkKYGBgCgoK